Назад | Перейти на главную страницу

bash: преобразовать дату из в метку времени unix, изменить метку времени

Выполнение следующей команды на xen-серверах (либо DOM0, либо DOMU) в $ company дает мне отрицательное число, на каждой другой системе ноль (0) (даже в моем cygwin).

date -d "1970-01-01T00:00:00" "+%s"

$TZ не настроен, /etc/localtime это тот же файл, что и /usr/share/zoneinfo/UTC

date находится в версии 8.12 из GNU coreutils. Что здесь пошло не так? Какая дополнительная информация может понадобиться?

если $ TZ не установлен, а / etc / localtime - это UTC, тогда почему вы используете часовой пояс T (Tango) в команде даты?

В моей системе у меня есть местное время EDT.

# date
Wed Mar 18 12:39:03 EDT 2015

# date -d "1970-01-01 00:00:00" "+%s"
18000

Если я заставлю его использовать Tango, я получу отрицательное число:

# date -d "1970-01-01T00:00:00" "+%s"
-25200

Если я изменю свой часовой пояс на UTC, он будет работать, как ожидалось:

# export TZ=UTC
# date
Wed Mar 18 16:41:23 UTC 2015
# date -d "1970-01-01 00:00:00" "+%s"
0

со страницы руководства даты:

DATE STRING
       The  --date=STRING  is  a  mostly  free  format human readable date string such as "Sun, 29 Feb 2004 16:21:42
   -0800" or "2004-02-29 16:21:42" or even "next Thursday".  A date string may contain items indicating calendar
   date,  time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indi-
   cates the beginning of the day.  The date string format is more complex than is easily documented here but is
   fully described in the info documentation.

Как вы можете видеть, это «дата в основном в свободном формате, удобочитаемая человеком», она выбирает часовой пояс из любого места, где сочтет нужным. Проверить это очень легко.

Например:

# date
Wed Mar 18 13:05:42 EDT 2015

теперь со временем танго:

[root@wailea ~]# date -d "2015-3-18T13:05:42" 
Wed Mar 18 02:05:42 EDT 2015

теперь со временем танго в конце:

[root@wailea ~]# date -d "2015-3-18 13:05:42 T" 
Wed Mar 18 02:05:42 EDT 2015

теперь по зулусскому времени:

[root@wailea ~]# date -d "2015-3-18Z13:05:42" 
Wed Mar 18 09:05:42 EDT 2015

Думаю, вы понимаете суть. Если вы не знакомы с военными часовыми поясами, вот список: http://www.timeanddate.com/time/zones/m military

Вы также можете попробовать использовать zdump, чтобы убедиться, что ваш файл зоны не совсем то, что вы ожидаете:

Zdump prints the current time in each zonename named on the command line.

# zdump /etc/localtime
/etc/localtime  Wed Mar 18 21:21:04 2015 EDT

При указании даты и времени в ISO 8601 формат, вам нужно добавить Z если вы хотите, чтобы он обрабатывался как UTC:

$ date -d "1970-01-01T00:00:00Z" "+%s"
0

В качестве альтернативы вы можете использовать смещение UTC либо +0 или -0 вместо того Z.