我试图在 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
不显示当前日期,而是显示后面的字符串定义的日期。