Шаблон разбора даты - PullRequest
       88

Шаблон разбора даты

1 голос
/ 14 октября 2019

Я пытаюсь преобразовать дату в определенный формат, используя awk, и следующие команды, которые я пробовал,

$ echo | awk -v Date=`date -d '2019-10-07'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T00:00:00
$ echo | awk -v Date=`date -d '2019-10-07T'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T01:00:00
$ echo | awk -v Date=`date -d '2019-10-07D'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T12:00:00
$ echo | awk -v Date=`date -d '2019-10-07S'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T02:00:00
$ echo | awk -v Date=`date -d '2019-10-07U'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T00:00:00

Здесь я не понимаю, почему дата "2019-10-07T"возвращает "2019-10-07T01:00:00" и "2019-10-07S" возвращает "2019-10-07T02:00:00" и т. д.

Я пытался понять значение T, S, вас и т. д., но не смог найти ни одного.

Не могли бы выпожалуйста, совет?

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

К сожалению, совершенно невозможно обернуть ваш мозг вокруг логики, которая определяет почти бесконечное множество форматов ввода даты , которые может обрабатывать команда date. Тем не менее, очень впечатляет, что им удается делать это так хорошо! Особенно, когда вы понимаете множество форматов даты и времени, которые придумало человечество.

То, что вы обнаружили, это то, что называется военные часовые пояса , еще одна форма написания даты-времени, но организованнаяодин. Поэтому, когда вы просите date преобразовать «2019-10-07S», он примет «2019-10-07T00: 00: 00» в часовом поясе Сьерры (UTC-6). Следовательно, ваш результат должен быть «2019-10-06T18: 00: 00 UTC». Тем не менее, вы получаете «2019-10-07T02: 00: 00», что не то же самое. Это потому, что date возвращает строку формата в вашем местном часовом поясе и сообщает мне, что в настоящее время ваша система настроена на UTC + 8.

Мы можем проверить это как:

$ TZ="Australia/Perth" date -d "2019-10-07S" "+%FT%T %z %Z"
2019-10-07T02:00:00 +0800 AWST
$ TZ="UTC-8" date -d "2019-10-07S" "+%FT%T %z %Z"
2019-10-07T02:00:00 +0800 UTC

Примечание: Имейте в виду, что TZ="UTC-8" на самом деле означает UTC + 8. Эта запись интерпретируется как часовой пояс Posix. (См .: U & L: почему TZ = UTC-8 производит даты с UTC + 8? )

ISO 8601 was published on 06/05/88 and most recently amended on 12/01/04.

0 голосов
/ 14 октября 2019

Вероятно, использование чего-то подобного может быть умнее в awk

print strftime("Time = %m/%d/%Y %H:%M:%S", systime())

Для вашего первоначального вопроса, вероятно, вы можете прочитать this

...