带有时区和夏令时的纪元的日期和时间(以秒为单位)

Posted

技术标签:

【中文标题】带有时区和夏令时的纪元的日期和时间(以秒为单位)【英文标题】:date and time from epoch in seconds WITH timezone and daylight saving 【发布时间】:2016-03-29 20:17:33 【问题描述】:

我正在尝试从 bash 中的 epoch 获取当前日期/时间秒数。 我做到了

date +%s

但这不能处理我的时区和夏令时。

类似的东西 1) 获取纪元 2)加3600(我在罗马,所以GMT+1) 3) 仅当我们处于夏令时时才添加 3600

在 bash 中有可能吗?

【问题讨论】:

【参考方案1】:

我找到了办法:

#!/bin/sh
OFFSET=$(date +%z)
SIGN=$OFFSET:0:1
HOURS=$OFFSET:1:2
MINUTES=$OFFSET:3:2
EPOCH=$(date +%s)
echo $(( $EPOCH $SIGN ( $HOURS * 3600 + $MINUTES * 60 ) ))

【讨论】:

【参考方案2】:

date [-u|--utc|--universal] 返回 UTC 表示,而 date 返回与 DST(夏令时)相关的系统本地时间。

示例(假设 2016-06-01 在 DST 内):

从您的时区获取当地时间(夏令时为 GMT+1 +1)

$ date -d '2016-06-01 02:00:00+0200' +'%s = %Y-%m-%d %H:%M:%S'
1464739200 = 2016-06-01 02:00:00

从您的时区获取 UTC(纪元)(对于 DST,GMT+1 +1)

$ date -u -d '2016-06-01 02:00:00+0200' +'%s = %Y-%m-%d %H:%M:%S'
1464739200 = 2016-06-01 00:00:00

【讨论】:

值得指出的是,日期的这种用法特定于 GNU coreutils 的版本(即在 Linux 中使用)。 -d 选项在 OSX、FreeBSD、NetBSD、Solaris 等中不存在(或做不同的事情)。

以上是关于带有时区和夏令时的纪元的日期和时间(以秒为单位)的主要内容,如果未能解决你的问题,请参考以下文章

如何从给定城市的给定日期和时间获取 unix 纪元时间戳(以秒为单位)?

在 Google 表格中将 Unix 纪元时间转换为日期

Javascript 日增量(以秒为单位)在下午 5:00 翻转

如何从 postgres 获取时间戳作为 Unix 纪元?

如何使用 Perl 找到今天(本地时区)的最小纪元时间?

100K+ 行数据集中的日期时间差(以秒为单位)