date -u -d“ TZ =” MET“ 2020-03-29 02:01:00”对Gnu日期意味着什么?

时间:2020-03-06 09:02:35

标签: date timezone gnu gnu-date

在阅读夏令时,时区和gnu date命令时,我学到了很多东西。

例如,如果我想将悉尼的时间点转换为纽约的时间,则使用“ TZ =“ inside the date string and the environment。惊人。

因此我了解到,如果我想在柏林将UTC考虑为夏令时,我将不使用时区作为日期的一部分:

$ for hh in 00 01 02 03 04 05 ; do d="2020-03-29 $hh:01:00 MET" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
2020-03-29 00:01:00 MET => UTC: Sat Mar 28 23:01:00 UTC 2020
2020-03-29 01:01:00 MET => UTC: Sun Mar 29 00:01:00 UTC 2020
2020-03-29 02:01:00 MET => UTC: Sun Mar 29 01:01:00 UTC 2020
2020-03-29 03:01:00 MET => UTC: Sun Mar 29 02:01:00 UTC 2020
2020-03-29 04:01:00 MET => UTC: Sun Mar 29 03:01:00 UTC 2020
2020-03-29 05:01:00 MET => UTC: Sun Mar 29 04:01:00 UTC 2020

这肯定是错误的结果,因为小时是连续的。我知道为什么会这样:因为“ MET”固定在UTC + 1,并且不考虑切换。对于“ MEST”,有些说法是正确的:

$ for hh in 00 01 02 03 04 05 ; do d="2020-03-29 $hh:01:00 MEST" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
2020-03-29 00:01:00 MEST => UTC: Sat Mar 28 22:01:00 UTC 2020
2020-03-29 01:01:00 MEST => UTC: Sat Mar 28 23:01:00 UTC 2020
2020-03-29 02:01:00 MEST => UTC: Sun Mar 29 00:01:00 UTC 2020
2020-03-29 03:01:00 MEST => UTC: Sun Mar 29 01:01:00 UTC 2020
2020-03-29 04:01:00 MEST => UTC: Sun Mar 29 02:01:00 UTC 2020
2020-03-29 05:01:00 MEST => UTC: Sun Mar 29 03:01:00 UTC 2020

因此,方法是a)使用“欧洲/柏林”而不是MET或MEST,并且b)在日期字符串中提供TZ =。

瞧瞧:

$ for hh in 00 01 02 03 04 05 ; do d="TZ=\"Europe/Berlin\" 2020-03-29 $hh:01:00" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
TZ="Europe/Berlin" 2020-03-29 00:01:00 => UTC: Sat Mar 28 23:01:00 UTC 2020
TZ="Europe/Berlin" 2020-03-29 01:01:00 => UTC: Sun Mar 29 00:01:00 UTC 2020
date: invalid date ‘TZ="Europe/Berlin" 2020-03-29 02:01:00’
TZ="Europe/Berlin" 2020-03-29 02:01:00 => UTC:
TZ="Europe/Berlin" 2020-03-29 03:01:00 => UTC: Sun Mar 29 01:01:00 UTC 2020
TZ="Europe/Berlin" 2020-03-29 04:01:00 => UTC: Sun Mar 29 02:01:00 UTC 2020
TZ="Europe/Berlin" 2020-03-29 05:01:00 => UTC: Sun Mar 29 03:01:00 UTC 2020

这有点奇怪,因为与“ MET”不同,我不能只在-d时间之后加上“ Europe / Berlin”。但是。

现在有趣的部分来了。我还可以在日期字符串中放入带有“ TZ =“的“ MET”:

$ for hh in 00 01 02 03 04 05 ; do d="TZ=\"MET\" 2020-03-29 $hh:01:00" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
TZ="MET" 2020-03-29 00:01:00 => UTC: Sat Mar 28 23:01:00 UTC 2020
TZ="MET" 2020-03-29 01:01:00 => UTC: Sun Mar 29 00:01:00 UTC 2020
date: invalid date ‘TZ="MET" 2020-03-29 02:01:00’
TZ="MET" 2020-03-29 02:01:00 => UTC:
TZ="MET" 2020-03-29 03:01:00 => UTC: Sun Mar 29 01:01:00 UTC 2020
TZ="MET" 2020-03-29 04:01:00 => UTC: Sun Mar 29 02:01:00 UTC 2020
TZ="MET" 2020-03-29 05:01:00 => UTC: Sun Mar 29 03:01:00 UTC 2020

嗯...夏令时改变了吗?好...?和MEST?

$ for hh in 00 01 02 03 04 05 ; do d="TZ=\"MEST\" 2020-03-29 $hh:01:00" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
TZ="MEST" 2020-03-29 00:01:00 => UTC: Sun Mar 29 00:01:00 UTC 2020
TZ="MEST" 2020-03-29 01:01:00 => UTC: Sun Mar 29 01:01:00 UTC 2020
TZ="MEST" 2020-03-29 02:01:00 => UTC: Sun Mar 29 02:01:00 UTC 2020
TZ="MEST" 2020-03-29 03:01:00 => UTC: Sun Mar 29 03:01:00 UTC 2020
TZ="MEST" 2020-03-29 04:01:00 => UTC: Sun Mar 29 04:01:00 UTC 2020
TZ="MEST" 2020-03-29 05:01:00 => UTC: Sun Mar 29 05:01:00 UTC 2020

呃……完全令人困惑。为什么没有错误?这里会发生什么?

所以,我的问题是:三个时区的地方

  • 作为日期字符串后的时区
  • TZ=...在日期字符串内
  • TZ=...之外的环境变量date(此处未显示)

精确地表示gnu日期?

什么是

  • MET
  • MEST
  • 欧洲/柏林

在这些地方的日期是否?在不同的地方似乎有不同的理解,例如MEST作为日期时间的后缀或日期字符串内的TZ = MEST。

0 个答案:

没有答案
相关问题