据我所知,美国东部时间为东部标准时间GMT-5,东部夏令时间为GMT-4 .
那么,为什么这两条命令在回答中给出了不同的时间?
laptop % TZ=EST5EDT date
Wed Apr 27 12:16:36 EDT 2022
laptop % TZ=GMT-4 date
Wed Apr 27 20:16:40 GMT 2022他们不应该是一样的吗?
发布于 2022-04-27 17:55:01
实际上,使用TZ变量的方法主要有两种。旧的在POSIX标准中指定,它可以在实际变量中编码时区和当前的夏令时间规则。例如,欧洲UTC+2小时时区可能完全指定如下POSIX样式:
TZ=EET-2EEST,M3.5.0/3,M10.5.0/4请注意,此格式假定当前年份的DST规则也适用于任何过去和未来年份.这种假设不太可能是正确的。
由于这显然是不可取的,许多unix风格的开放源码软件使用TZ环境变量作为对更扩展的时区信息表的引用,包括特定时区的当前和历史定义。
这些基于表的实现中最全面的是Olson时区信息数据库,它现在是由IANA维护。Olson样式的TZ值通常采用/格式,但数据库也有其他选项。您可以在TZ变量中使用任何一种形式,但是如果值不明确,则优先使用POSIX格式,因为它是既定的标准。
TZ变量的POSIX标准定义是您自然假设的“向后”定义。第一个时区标签后的数字标识必须添加到本地时间的小时数,以获得UTC时间。
这可能是因为在POSIX标准开发之前,TZ环境变量约定的不同版本已经存在.由于Unix最初是在西半球发展起来的,所以现有的惯例倾向于对美国时区使用正数。(在Unix的早期,没有人会猜到,MULTICS OS开发项目的主要学术分支会成长为更大、更长寿的项目。)
我已经了解到,POSIX规范的开发人员尽力寻找已经最常见的行为,并将其编码为标准,除非有非常明显的理由不这样做。
所以,TZ=GMT-4被解释为POSIX风格.这并不意味着“一个时区,即格林尼治时间减去4小时”:它实际上意味着“一个时区,比世界协调时提前4小时,并命名为格林尼治标准时间”。我猜,您可以将您的自定义时区命名为您想要的任何东西,但是对于完全不同的东西重用一个众所周知的历史时区标识符会造成混乱。
如果您想通过Linux中的"GMT“指定一个时区,那么应该通过添加Etc/前缀来使用较新的Olson样式的TZ设置.即使如此,标志惯例也与你所期望的相反,很可能是为了保持与旧POSIX风格设置的类比。
比较:
$ TZ=Etc/GMT-4 date
Wed 27 Apr 21:09:32 +04 2022 # Olson: 4 hours east of UTC, timezone correctly identified numerically
$ TZ=GMT-4 date
Wed 27 Apr 21:09:50 GMT 2022 # POSIX: 4 hours east of UTC, misleading timezone identifier!
$ TZ=Etc/GMT+4 date
Wed 27 Apr 13:09:39 -04 2022 # Olson: 4 hours west of UTC, timezone correctly identified numerically
$ TZ=GMT+4 date
Wed 27 Apr 13:10:14 GMT 2022 # POSIX: 4 hours west of UTC, misleading timezone identifier!
$ date -u
Wed 27 Apr 17:10:25 UTC 2022 # UTC time for reference.https://unix.stackexchange.com/questions/700623
复制相似问题