被这个约会行为难倒了

被这个约会行为难倒了
$ date --version
date (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.

当前日期为美国东部夏令时间 (EDT)。

$ date
Tue Oct 27 21:16:35 EDT 2020

现在尝试转换为 UTC,即 +4。

$ env TZ=UTC date -d "21:07:28 EDT"
Thu Oct 29 01:07:28 UTC 2020

$ env TZ=Etc/UTC date --date='TZ="America/New_York" 21:07:28'
Thu Oct 29 01:07:28 UTC 2020

为什么是 10 月 29 日?应该是 10 月 28 日。

我完全被这个难住了。

谢谢你的帮助。

答案1

-d如果您只为选项提供时间date,它会将其解释为今天日期提供的时间。考虑到这一点,让我们看一下您的示例:

$ env TZ=UTC date -d "21:07:28 EDT"
Thu Oct 29 01:07:28 UTC 2020

你告诉日期打印出 21:07:28 EDT 的字符串表示形式当前日期。您还可以设置TZ=UTCTZ不仅用于格式化时间,还用于确定当前日期。

当您运行该命令时,UTC 时间约为 10 月 28 日凌晨 1 点。因此,您的日期命令将转换为“在 10 月 28 日 21:07:28 EDT 时打印 UTC 时间”。由于 UTC 比 EDT 早四个小时,因此它会打印 10 月 29 日 01:07:28。

如果您希望它在 指定的时区中使用除“今天”以外的其他日期$TZ,则必须明确说明。例如,

TZ=UTC date -d "Oct 27 21:07:28 EDT"

或者您可以第二次调用 date 命令来生成您当地时区的今天的日期:

TZ=UTC date -d "$(date +%F) 21:07:28 EDT"

TZ请注意,在调用 date 进行命令替换 (部分) 时,您的 shell 不会设置$(date +%F)。这就是为什么内部date会为您提供本地时区的日期。

相关内容