Ubuntu 18.04 странное поведение даты с параметром --date

Я обнаружил странное поведение программы date в Ubuntu 18.04.

Итак, я считаю, что date должна работать с - опцией даты и правильно обрабатывать + 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 час , но подождите минутку, почему я? m получается минус один час, когда я делаю плюс одну минуту?

6
задан 4 February 2019 в 21:27
1 ответ

Проблема в том, что date обрабатывает часть +1 как часовой пояс, а не как дополнительную минуту. Дополнительная минута исходит только от слова минут , которое анализируется как «добавить одну минуту», потому что оно неясно.

Вы можете увидеть это, если попробуете следующие команды:

  • Ваша исходная команда , что интерпретируется как «в часовом поясе UTC +1».

     $ date --date «2019-01-01 13:43:32 +1 минут» «+% Y-% m-% d  % H:% M:% S "
    2019-01-01 12:44:32
     
  • Измените на +2 и обратите внимание, что час уменьшился на единицу, а минуты остались прежними. Это интерпретируется как «в часовом поясе UTC +2».

     $ date --date «2019-01-01 13:43:32 +2 минуты» «+% Y-% m-% d% H:%  РС"
    2019-01-01 11:44:32
     
  • Обратите внимание, что простое использование +1 (без минут ) приводит к изменению только часа, а не минуты.

     $ date --date "2019-01  -01 13:43:32 +1 "" +% Y-% m-% d% H:% M:% S "
    2019-01-01 12:43:32
     
  • Обратите внимание, что слово минут интерпретируется как добавление одной минуты.

     $ date --date "2019-01-01 13:43:32 минут" "+% Y-% m  -% d% H:% M:% S "
    2019-01-01 13:44:32
     

Вот часть соответствующей документации:

  • Из вывода команды info date , секция 21.1.6 Параметры для 'date' :

     ... Для  например, '--date = "2004-02-27 14: 19: 13.489392193 +0530"'
    определяет момент времени, который составляет 489 392 193 наносекунды после
    27 февраля 2004 г. в 14:19:13 в часовом поясе 5 часов и
    30 минут к востоку от UTC.  ...
     

    Обратите внимание на использование +530 для описания часового пояса.

  • Из вывода команды info date , секция 28.7 Относительные элементы в строках даты :

     ... Единице времени может предшествовать множитель в виде
    необязательно подписанный номер.  Беззнаковые числа принимаются положительно
    подписано.  Никакое число не подразумевает 1 для множителя.  После
    относительный элемент строкой «назад» эквивалентен предшествующему элементу
    множитель со значением -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 и не вижу никаких коммитов, которые явно вызвали бы такое изменение.

7
ответ дан 3 December 2019 в 00:24

Теги

Похожие вопросы