Я пытаюсь использовать команду даты для создания временной метки файла, которую сама команда даты может интерпретировать. Однако команде date, похоже, не нравится ее собственный вывод, и я не уверен, как обойти это. Дело в точке:
sh-4.2$ date
Fri Jan 3 14:22:19 PST 2014
sh-4.2$ date +%Y%m%dT%H%M
20140103T1422
sh-4.2$ date -d "20140103T1422"
Thu Jan 2 23:22:00 PST 2014
дата, кажется, интерпретирует строку со смещением 15 часов. Есть ли известные обходные пути для этого?
Изменить: это не проблема отображения:
sh-4.2$ date +%s
1388791096
sh-4.2$ date +%Y%m%dT%H%M
20140103T1518
sh-4.2$ date -d 20140103T1518 +%s
1388737080
sh-4.2$ python
Python 3.3.3 (default, Nov 26 2013, 13:33:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1388737080 - 1388791096
-54016
>>> 54016/3600
15.004444444444445
>>>
Он все еще отключен на 15 часов, когда отображается как метка времени Unix.
РЕДАКТИРОВАТЬ # 1
Может быть, я должен задать этот вопрос немного по-другому. Скажем, у меня есть список основных временных отметок ISO8601 в форме:
- YYYYMMDDThhmm
- YYYYMMDDTHHMMSS
Какой самый простой способ преобразовать их в соответствующие метки времени Unix?
Например:
- 20140103T1422 = 1388787720
- 20140103T142233 = 1388787753
shell-script
date
alex.forencich
источник
источник
20140103T1518
недействителен ISO 8601, он пропускает часть часового поясаОтветы:
Вы просите «известные обходные пути». Вот простой:
Это использует
sed
для замены «Т» с пробелом. Результатом является формат, которыйdate
понимает.Если мы добавим секунды к дате ISO8601, то
date
потребуются дополнительные изменения:В приведенном выше
sed
тексте «Т» заменяется пробелом, а также разделяет ЧЧММСС на ЧЧ: ММ: СС.источник
В информационном документе coreutils говорится, что ISO 8601 "расширенный формат" поддерживается.
Вам нужно будет добавить дефисы, двоеточия, и,
+%z
чтобы это работало.Чтобы ответить на вашу вторую часть вопроса ...
Поскольку формат даты содержит только цифры и символы, вы можете заменить каждый символ уникальной буквой, например, используя
tr
Или вы можете разобрать его, используя и
T
и-
или+
как разделители, например, используя shell${var%word}
и${var#word}
расширениеили используя
bash
сопоставление регулярного выраженияили Perl, Python и т. д. и т. д.
источник
GNU coreutils поддерживает только даты ISO 8601 в качестве входных данных начиная с версии 8.13 (выпущенной 2011-09-08). Вы должны использовать более старую версию.
В старых версиях вам необходимо заменить
T
пробел. В противном случае он интерпретируется как военный часовой пояс США .Даже в последних версиях распознается только полностью пунктуированная форма, а не базовый формат, состоящий только из цифр и символа a
T
в середине.источник
Я заметил эту заметку на странице руководства для
date
.Он не является окончательным, но он явно не показывает строку формата времени, которая включает в себя,
T
как вы пытаетесь, для [ISO 8601]. Как указано в ответе @Gilles , поддержка ISO 8601 в GNU CoreUtils является относительно новой.Переформатирование строки
Вы можете использовать Perl, чтобы переформулировать вашу строку.
Пример:
Вы можете сделать это как для строк, которые содержат секунды, так и для тех, которые не содержат.
20140103T1422:
20140103T142233:
источник
В соответствии с man-страницей даты, формат, который вы выводите, не совпадает с тем, который
date
ожидает ввод. Вот что написано на странице руководства:Так что вы можете сделать это так:
Потому что в переменных, которые используются для определения выходной строки,
+%m%d%H%M%Y
будет равно тому, что он ожидает в качестве ввода.источник