使用“date”转换不同时区的日期

Converting date in a different timezone with `date`

我正在尝试使用 UNIX date 转换来自不同时区的日期(我在 Ubuntu 20.04)。

当前日期,效果很好:

$ date
dim. 12 déc. 2021 11:59:16 CET
$ TZ=Pacific/Tahiti date
dim. 12 déc. 2021 00:59:32 -10

但是当我处理一个字符串时,它失败了:

$ export testdate="2021/10/28 17:47:26"
$ date -d "$test"
jeu. 28 oct. 2021 17:47:26 CEST
$ TZ=Pacific/Tahiti date -d "$test"
jeu. 28 oct. 2021 17:47:26 -10

如我所料:

jeu 28 oct. 2021 05:47:26 -10

我不明白为什么我没有得到正确的班次。当然,如果我尝试使用日期也应该更改的日期和时间,它也不起作用:

$ export test="2021/10/28 7:47:26"
$ date -d "$test"
jeu. 28 oct. 2021 07:47:26 CEST
$ TZ=Pacific/Tahiti date -d "$test" "+%F %T %Z"
2021-10-28 07:47:26 -10

在我期待的时候:

mer 27 oct. 2021 19:47:26 -10

我不是很自信,但我的印象是您正在寻找以下语法:

LC_TIME="es_ES.UTF8" TZ="America/New_York" date --date='TZ="Europe/Amsterdam" 2021/10/28 17:47:26' "+%A %F %T %B"

采用预定义的日期时间(解释为 Amsterdam 的本地时间),同时将日期时间(基于时差)调整为 New York 时间;然后它用 months/weekdays 的西班牙语名称打印结果(前提是您的系统上存在该语言的区域设置)。

一个简单的方法是先将时间转换为纪元时间:

test="2021/10/28 17:47:26"
TZ=Pacific/Tahiti date -d @$(date -d "$test" +%s)

date -d "$test" +%s 将本地时间转换为纪元时间。

TZ=Pacific/Tahiti date -d @$(date -d "$test" +%s) 从纪元时间打印大溪地时间。

why I don't get the proper shift

test="2021/10/28 17:47:26"

是未知时区的日期。没有人知道它在哪个时区,白天是什么时候。 GNU date 试图“猜测”你的意思是什么偏移量,它通常遍历当前时区的 TZ 数据库并只选择匹配的第一个偏移量。此外,指定时区不足以知道现在是什么时候,您必须具体。

此外,由于夏令时,您可以及时“返回”时间,现在即使您知道时区,也可以知道 UTC 的偏移量。

此外,您不必导出它 - 日期不关心 test 环境变量。

Converting date in a different timezone with date

如果输入的是 UTC,请告诉日期。

$ LC_ALL=C TZ=Pacific/Tahiti date -d "2021/10/28 17:47:26 UTC"
Thu Oct 28 07:47:26 -10 2021

如果输入有任何其他偏移量,请告诉日期。

$ LC_ALL=C TZ=Pacific/Tahiti date -d "2021/10/28 17:47:26 CEST"
Thu Oct 28 05:47:26 -10 2021

输入格式的GNU日期解析一般是个谜。文档将 2004-02-29 16:21:42 格式列为示例输入,因此我推荐该格式。如果你想要准确,我推荐 strptime 来自 dateutils (或真正的编程语言)。