Я экспериментировал с date
попытками преобразовать выражения, например, «2 часа», в число секунд, например, 7200. Я думал, что смогу сделать это с помощью таких вызовов:
date -d "1970-01-01 00:00:00 + 2 hours" +"%s"
Однако при этом я заметил крайне странные результаты. (В моем /etc/timezone
случае указано «Европа/Париж», отсюда и использование TZ
для принудительного перехода на время UTC.)
omega:~$ TZ=utc date -d "1970-01-01 00:00:00" +"%s"
0
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 0 minutes" +"%s"
60
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + -1 minutes" +"%s"
3660
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 1 minutes" +"%s"
-3540
Первый результат достаточно разумен, но я действительно полностью озадачен тем, как date
могли появиться три последних результата. Кто-нибудь понимает логику между этими результатами?
решение1
Я думаю, что он принимает ваш + x
параметр как спецификатор часового пояса (например, считает, 2013-04-25 19:52:36 +4
что это допустимая временная метка, в часовом поясе на 4 часа опережающем UTC).
Затем он видит слово «минуты» и воспринимает его как синоним слова «минута», поэтому вы получаете на одну минуту позже.
Если вы укажете явный спецификатор часового пояса, это сработает:
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 0 minutes" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + -1 minutes" +"%s"
-60
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 1 minutes" +"%s"
60
Обратите внимание на UTC
поле после секунд. Вы также можете ввести секунду +0
:
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60
... но, по крайней мере, лично мне это читать гораздо сложнее.
Или вы можете поставить a Z
после секунд и т. д. На самом деле вам не нужно TZ
устанавливать переменную окружения на UTC в приведенных выше примерах.