我必须根据 GMT 时间戳计算日期纪元时间,但我本地不在该时区。我当前的当地时间是 CEST。
所以当我尝试计算纪元时间时
date -d "2017-08-05 10:10:10" "+%s"
我明白了
1501927810
但给定的时间是 GMT,因此应该导致
1501927810
我试图手动添加当地时间和 GMT 之间的时差
date -d "2017-08-05 10:10:10 +2 hours" "+%F %T"
但这给了我
2017-08-05 11:10:10
为什么只增加了+1小时!?
答案1
您可以date
通过设置环境变量来告诉使用 GMT 时区TZ
:
$ TZ=GMT date -d "2017-08-05 10:10:10" "+%s"
1501927810
否则,您必须将日期字符串指定为 GMT(+0 小时,而不是 2):
$ date -d "2017-08-05 10:10:10 +0" "+%s"
1501927810
答案2
您可以将原始日期所在的已知时区添加到日期字符串中:
date -d "2017-08-05 10:10:10 GMT" +%s
1501927810
date -d "2017-08-05 10:10:10 PST" +%s
1501956610
正如其他答案中提到的,您还必须考虑夏令时的变化,并且GMT
实际上可能不是您正在寻找的时区。
您还可以使用以下格式:
date --date 'TZ="Europe/London" 2017-08-05 10:10:10' +%s
1501924210
这与设置环境变量不同TZ
,您应该知道TZ
在使用纪元时间戳时使用环境变量不起作用:
echo "TODAY: $(TZ=UTC date) : $(TZ=UTC date '+%s') YESTERDAY: $(TZ=UTC+24 date) $(TZ=UTC+24 date '+%s')"
TODAY: Fri Oct 15 21:57:12 UTC 2021 : 1634335032 YESTERDAY: Thu Oct 14 21:57:12 UTC 2021 1634335032
请注意,日期是正确的,但纪元时间戳是相同的。
这确实有效:
echo "TODAY: $(date) : $(date '+%s') YESTERDAY: $(date -d '24 hours ago') $(date -d '24 hours ago' '+%s')"
TODAY: Fri Oct 15 23:05:03 IST 2021 : 1634335503 YESTERDAY: Thu Oct 14 23:05:03 IST 2021 1634249103
这是因为纪元时间戳不受时区的影响,因为它们只是自特定日期以来的秒数。无论您位于哪个时区,这都是一样的。
因此,如果您想要不同时区中某个日期的纪元时间戳,您可以使用类似
date -d "$(TZ=PST date)" +%s
如果您已经有一个日期字符串,并且知道它来自不同的时区,并且希望它是纪元时间戳,则使用TZ
环境变量也不起作用:
TZ=GMT date -d "2017-08-05 10:10:10" "+%s"
1501927810
产生与以下相同的时间戳:
TZ=PST date -d "2017-08-05 10:10:10" "+%s"
1501927810
答案3
如果您的时间戳采用 UTC 格式,那么您可以date
使用以下选项来指示使用 UTC -u
:
-u
,--utc
,--universal
打印或设置协调世界时 (UTC)
答案4
GMT 通常用于描述夏季和冬季之间相差一小时的时区(英国、葡萄牙等)。 8 月,英国将采用 GMT+1,但在许多情况下,时区仍被描述为 GMT,尽管一年中该部分的标签是 BST。时date
区将写为“欧洲/伦敦”。 (请注意,原始时区在日期定义中声明。您可以通过设置来选择要显示的目标时区TZ
外部命令date
,作为环境变量,以通常的方式。)
date --date 'TZ="Europe/London" 2017-08-05 10:10:10'
在其他上下文中,GMT 用于描述与 UTC 大致等效的不变量。这里时区将简单地指定为“GMT”。
date --date 'TZ="GMT" 2017-08-05 10:10:10'
这取决于数据源,您的时间戳对应于哪一个,这很重要,因为在八月,它们会相差一个小时。