Я обнаружил странное поведение date
программа в Ubuntu 18.04.
Итак, я считаю date
должен работать с --date option
и правильно обработать + N минут:
date --date "2019-01-01 13:43:32 +1 minutes" "+%Y-%m-%d %H:%M:%S"
Но в Ubuntu 16.04 я получу:
2019-01-01 13:44:32
А в 18.04:
2019-01-01 12:44:32
Решение добавить +1 hours
также, но, подождите, почему у меня минус один час, когда у меня плюс одна минута?
Проблема здесь в том, что date
лечит +1
часть как часовой пояс, и не как лишнюю минуту. Дополнительная минута исходит только от слова minutes
который анализируется как "добавить одну минуту", потому что это неясно.
Вы можете убедиться в этом, если попробуете следующие команды:
Ваша исходная команда, которая интерпретируется как «в часовом поясе UTC +1».
$ date --date "2019-01-01 13:43:32 +1 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 12:44:32
Изменить на +2
и обратите внимание, что час уменьшился на единицу, но минута осталась прежней. Это интерпретируется как «часовой пояс UTC +2».
$ date --date "2019-01-01 13:43:32 +2 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 11:44:32
Обратите внимание, что просто используя +1
(без minutes
) дает изменение только часа, а не минуты.
$ date --date "2019-01-01 13:43:32 +1" "+%Y-%m-%d %H:%M:%S"
2019-01-01 12:43:32
Обратите внимание, что слово minutes
интерпретируется как добавление одной минуты.
$ date --date "2019-01-01 13:43:32 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 13:44:32
Из info date
вывод команды, раздел 21.1.6 Options for ‘date’
:
... For example, ‘--date="2004-02-27 14:19:13.489392193 +0530"’ specifies the instant of time that is 489,392,193 nanoseconds after February 27, 2004 at 2:19:13 PM in a time zone that is 5 hours and 30 minutes east of UTC. ...
Обратите внимание на использование +530
для описания часового пояса.
Из info date
вывод команды, раздел 28.7 Relative items in date strings
:
... The unit of time may be preceded by a multiplier, given as an optionally signed number. Unsigned numbers are taken as positively signed. No number at all implies 1 for a multiplier. Following a relative item by the string ‘ago’ is equivalent to preceding the unit by a multiplier with value -1. ...
Обратите внимание на текст: «Отсутствие числа означает 1 для множителя».
Один из вариантов - изменить порядок строковых элементов:
$ date --date "+1 minutes 2019-01-01 13:43:32" "+%Y-%m-%d %H:%M:%S"
2019-01-01 13:44:32
Другой вариант (вариант, который я бы предпочел) - явно указать часовой пояс:
$ date --date "2019-01-01 13:43:32 UTC +1 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 13:44:32
(Обратите внимание, что вы также можете использовать +0
или Z
в качестве альтернативы UTC
в строке выше.)
Также обратите внимание, что если вы используете date
версии 8.26 или новее (как Ubuntu 18.04; 16.04 использует 8.25), вы можете добавить --debug
флаг для date
чтобы рассказать вам, как он анализировал вводимый текст:
$ date --date "2019-01-01 13:43:32 +1 minutes" --debug "+%Y-%m-%d %H:%M:%S"
date: parsed date part: (Y-M-D) 2019-01-01
date: parsed time part: 13:43:32 UTC+01
date: parsed relative part: +1 minutes
date: input timezone: parsed date/time string (+01)
date: using specified time as starting value: '13:43:32'
date: starting date/time: '(Y-M-D) 2019-01-01 13:43:32 TZ=+01'
date: '(Y-M-D) 2019-01-01 13:43:32 TZ=+01' = 1546346612 epoch-seconds
date: after time adjustment (+0 hours, +1 minutes, +0 seconds, +0 ns),
date: new time = 1546346672 epoch-seconds
date: timezone: system default
date: final: 1546346672.000000000 (epoch-seconds)
date: final: (Y-M-D) 2019-01-01 12:44:32 (UTC)
date: final: (Y-M-D) 2019-01-01 12:44:32 (UTC+00)
2019-01-01 12:44:32
vs.
$ date --date "+1 minutes 2019-01-01 13:43:32" --debug "+%Y-%m-%d %H:%M:%S"
date: parsed relative part: +1 minutes
date: parsed date part: (Y-M-D) 2019-01-01
date: parsed time part: 13:43:32
date: input timezone: system default
date: using specified time as starting value: '13:43:32'
date: starting date/time: '(Y-M-D) 2019-01-01 13:43:32'
date: '(Y-M-D) 2019-01-01 13:43:32' = 1546350212 epoch-seconds
date: after time adjustment (+0 hours, +1 minutes, +0 seconds, +0 ns),
date: new time = 1546350272 epoch-seconds
date: timezone: system default
date: final: 1546350272.000000000 (epoch-seconds)
date: final: (Y-M-D) 2019-01-01 13:44:32 (UTC)
date: final: (Y-M-D) 2019-01-01 13:44:32 (UTC+00)
2019-01-01 13:44:32
Последнее замечание: я понятия не имею, почему вы получаете другой результат 16.04. На моих машинах 16.04 я получаю тот же результат, что и мои машины 18.04. Я также просмотрел git-историю GNU coreutils и не вижу никаких коммитов, которые явно вызывали бы такое изменение.