将时区偏移添加到本地时区

将时区偏移添加到本地时区

我试图在 Ubuntu 20.04 和 CentOS 7 中获取与“昨天”(理解为 1 天前)相对应的日期字符串。到目前为止,我已经成功地使用了不存在的时区,例如 、aaa和应用 24 小时偏移。也就是说,我尝试执行的命令如下所示:

YESTERDAY=`TZ=aaa24 date '+%y%m%d'`

这一切都很好,直到我意识到该日期对于我的时区来说不正确。
我尝试应用正确的时区(对我来说,是欧洲/罗马),但它停止正常工作。更确切地说:

TZ="Europe/Rome" date "+%Y%m%d %H:%M %Z"
20210208 08:25 CET
TZ="Europe/Rome24" date "+%Y%m%d %H:%M %Z"
20210208 07:25 Europe

最后一个命令中暴露的时区听起来好像它没有正确理解时区,或者它使用了似乎与 GMT 同步的默认“欧洲”时区,同时忽略了偏移量。

我尝试删除“子区域”/Rome进行一些尝试,似乎在这种情况下时区偏移量被正确理解:

TZ="Europe" date "+%Y%m%d %H:%M %Z"
20210208 07:25 Europe
TZ="Europe24" date "+%Y%m%d %H:%M %Z"
20210207 07:25 Europe

有没有办法将偏移量应用于特定的“子”时区,例如欧洲/罗马?谢谢。

答案1

Ubuntu 和 CentOS 都使用 GNU 日期,因此请使用以下-d选项:

 $ date "+%Y%m%d %H:%M %Z"
20210209 10:09 EST

$ date -d "yesterday" "+%Y%m%d %H:%M %Z"
20210208 10:09 EST

有关如何date解析-d参数的更多详细信息,请阅读info date(或在线的


只是提醒一下,时间很奇怪,尤其是夏令时:在古巴,夏令时转换发生在午夜,今年(2021 年)的 3 月 14 日。那天的午夜不存在:

$ env TZ=America/Havana date -d '2021-03-14'
date: invalid date ‘2021-03-14’

# but
$ env TZ=America/Havana date -d '2021-03-14 01:00:00'
Sun Mar 14 01:00:00 CDT 2021

以天为单位进行日期运算可能与以小时为单位进行日期运算不同:让我们转到 3 月 15 日,然后时间倒退:

$ env TZ=America/Havana date -d '2021-03-15' '+%Y-%m-%d'
2021-03-15

$ env TZ=America/Havana date -d '2021-03-15 -1 day' '+%Y-%m-%d'
2021-03-14

$ env TZ=America/Havana date -d '2021-03-15 -24 hours' '+%Y-%m-%d'
2021-03-13

这是为什么?由于古巴 2021 年 3 月 14 日有 23 小时,因此减去 24 小时即可返回 1 天零 1 小时:

$ env TZ=America/Havana date -d '2021-03-15' '+%Y-%m-%d %T'
2021-03-15 00:00:00

$ env TZ=America/Havana date -d '2021-03-15 -1 day' '+%Y-%m-%d %T'
2021-03-14 01:00:00

$ env TZ=America/Havana date -d '2021-03-15 -24 hours' '+%Y-%m-%d %T'
2021-03-13 23:00:00

这不仅限于古巴:任何实行夏令时的时区都会在时钟向前移动的那一天这样做。

答案2

我不知道如何使用时区来完成此操作,但 24 小时前的日期可以显示如下:

date -d @$(($(date +%s)-24*3600))

这将当前日期表示为自 1970 年以来的秒数date +%s,然后减去 24 小时。date -d不显示当前日期,而是显示后面的字符串定义的日期。

相关内容