从 GMT 时间戳获取纪元时间

从 GMT 时间戳获取纪元时间

我必须根据 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'

这取决于数据源,您的时间戳对应于哪一个,这很重要,因为在八月,它们会相差一个小时。

相关内容