bash:将日期从转换为unix时间戳更改时间戳

bash:将日期从转换为unix时间戳更改时间戳

在 $company 的 xen 服务器(DOM0 或 DOMU)上运行以下命令会给出一个负数,而在其他每个系统上则为零(0)(即使在我的 cygwin 中)。

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

$TZ未设置,/etc/localtime/usr/share/zoneinfo/UTC

date 是 GNU coreutils 的 8.12 版本。这里出了什么问题?可能需要哪些其他信息?

答案1

如果未设置 $TZ 且 /etc/localtime 是 UTC,那么为什么在 date 命令中使用时区 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/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

答案2

在指定日期和时间时ISO 8601Z格式,如果您想强制将其作为 UTC 处理,则需要附加:

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

+0或者,您可以使用或的 UTC 偏移量-0来代替Z

相关内容