
У меня есть две временные метки, одна такая 24MAR17:00:14:09
, а другая такая, 2017-03-25 05:52:09.373941000
и я хочу сравнить две временные метки, одинаковые они или нет. Я перепробовал много функций даты и функций awk, но ничего не дало мне результатов. Пожалуйста, помогите мне.
решение1
Башрешение:
#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'
d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"
if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then
echo "dates are equal"
else
echo "dates are unequal"
fi
решение2
Попробуй это,
Время 2017-03-25 05:52:09.373941000
можно преобразовать в первый формат 24MAR17:00:14:09
, а затем выполнить сравнение.
date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" | tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"
решение3
Основная проблема — парсить предоставленные строки. Команда date принимает только некоторые форматы, а не все. Решение — воспользоваться возможностью busybox принимать (почти) dateлюбойформат.
Д1
Создайте строку формата, которая выводит дату в том же формате, что и предоставленная:
$ date -u +'%d%b%y:%T' 07Jul17:15:18:48
Используйте эту строку, чтобы сообщить busybox date, как анализировать строку даты. Помните, что локальная TZ может изменить результат, используйте -u (UTC), чтобы избежать ошибок, или обязательно установите правильную TZ для строки времени, которую нужно анализировать.
$ d1='24MAR17:00:14:09' $ busybox date -u -D '%d%b%y:%T' -d "$d1" Fri Mar 24 00:14:09 UTC 2017
Заставьте busybox date вывести значение в секундах (с начала эпохи):
$ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s' 1490314449
Д2
Вы можете повторить процедуру и для второй временной метки, но в этом случае строка понимается непосредственно по дате:
$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129
И busybox date, удаляющий наносекунды ( ${d2%.*}
) (подробнее об этом позже):
$ busybox date -u -d "${d2%.*}" +'%s'
1490421129
Разница
Вы должны были зафиксировать результаты выше в двух переменных:
$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"
Затем вычислите разницу и сравните с нулем:
$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different
Или напрямую сравните строки (не значения):
$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different
Наносекунды
Если вам нужно сравнить еще и наносекунды, возникнут три проблемы.
Первое значение не имеет наносекунд. Первое — первая дата не имеет значения наносекунд.
Вы можете добавить 9 нулей:$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')" $ resd1="$resd1""$(printf '%0*d' 9 0)" $ echo "$resd1"echo "$resd2 - $resd1" 1490314449000000000
Или (лучше) повторно обработать значение с датой:
$ resd1="$(date -u -d "@$resd1" +'%s%N')" $ echo "$resd1" 1490314449000000000
Вторая дата имеет наносекунды. В этом случае вторая дата имеет формат, который date может обрабатывать напрямую, но если бы у нее был формат, требующий предварительной обработки busybox date, нам нужно было бы добавить наносекунды позже. Например:
$ d2='2017-03-25 05:52:09.373941000' $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}" $ echo "$resd2" 1490421129373941000
И bash, который вы используете, должен уметь обрабатывать 64-битные целые числа.
Если это так, вычислите разницу:$ echo "(( $resd2 - $resd1 ))" (( 1490421129373941000 - 1490314449000000000 )) $ echo "$(( $resd1 - $resd2 ))" 106680373941000
Что составляет чуть более 106 тысяч секунд (~29 часов):
$ echo "$(( ($resd2 - $resd1)/10**9 ))" 106680