Почему команда date выдает ошибку, несмотря на успешное вычисление ответа? - PullRequest
0 голосов
/ 24 июня 2019

Для контекста я работаю на машине Windows с MINGW64. У меня не было возможности проверить это на машине с Linux.

Я работаю с [date][1] в bash и пытаюсь добавить дни к дате, представленной в секундах с 1970-01-01 00:00:00, т.е. в формате %s. У меня есть следующий код Bash:

DATE1=$(date --date=now "+%s")
echo "DATE1: ${DATE1}"
DATE2=$(date --date="$(date --date="${DATE1}" "+%s")+2 days" "+%d%b%Y %H:%M:%S")
echo "DATE2: ${DATE2}"

Что дает вывод на консоль

DATE1: 156133763
date: invalid date '1561337963'
DATE2: 26Jun2019 10:59:24

На самом деле, DATE2 имеет ожидаемое значение с точностью до секунды. Однако консоль все равно выдает ошибку. Почему может возникнуть эта ошибка? Будет ли это как-то связано с запуском MINGW64?

Обновление:

Я запустил это на сервере Debian, к которому у меня есть доступ. Он вычислил время с now, как на MINGW, но вернул другую ошибку: ./test.sh: line 3: --date=1561342165: command not found. Запуск этого на том же сервере с пользовательской датой:

DATE1=$(date --date="$(date --date="19Jun2019 11:35:46" "+%d%b%Y %H:%M:%S")" "+%s")

Аналогично возвращается

DATE1: 1560908146
date: invalid date ‘1560908146’
DATE2: 26Jun2019 12:20:08

Что на самом деле указывает на то, что оно вообще не добавляет к определенной дате, а просто добавляет к сегодняшней дате (это 24 июня, где я сейчас нахожусь). Понятно, что что-то не так!

1 Ответ

4 голосов
/ 24 июня 2019

Если вы хотите преобразовать метку времени в дату, тогда вам нужно использовать @:

date --date=@1561344591 '+%F %T'
2019-06-24 04:49:51

Причина, по которой вы получили, казалось бы, правильный результат даже с сообщением об ошибке, заключается в том, что ваш DATE1теперь ваш внутренний вызов date выдает ошибку и ничего не возвращает, а затем внешний вызов просто --date=+2 days, что дает 2 дня.

Я не думаю, что вы можете использовать дату и времяв формате отметки времени вместе с относительными утверждениями не работает даже с @.Вы должны сначала преобразовать свою метку в удобочитаемую дату, но даже тогда вы должны быть осторожны.Вы можете подумать, что этого достаточно:

date --date="$(date --date=@1561344591 "+%F %T") + 2 days" "+%F %T"
2019-06-25 04:49:51

Как вы можете видеть, это все еще неправильно, и это потому, что +2 анализируется как часовой пояс.Вы исправляете это путем явного включения часового пояса в преобразование из отметки времени:

date --date="$(date --date=@1561344591 "+%F %T%Z") + 2 days" "+%F %T"
2019-06-26 04:49:51

В общем, использование отладки bash set -x и отладки даты date --debug ... помогает в решении таких проблем.

...