在JavaScript(在浏览器中运行)中,我有两个时区,形式为continent/location
。如何确定它们是否为同一时区?
请注意,仅检查电流偏移是行不通的。这两个时区可能是不同的区域,恰好今天具有相同的偏移量。我可以检查一年中每一天的偏移量,但这听起来不可行。
例子:
Europe/Oslo
和Europe/Brussels
相同(中欧时间/中欧夏令时)。Europe/Oslo
和Europe/London
是不一样的。
格式continent/location
来自 IANA 数据库的标识符。在此数据库中,每个标识符表示各个区域在历史记录中具有(以及将要具有)的所有偏移量的列表。
Europe/Oslo
和Europe/Brussels
今天可能"相同",但它们的偏移历史并不相同 - 实际上,这就是 IANA 为每个偏移分配不同 ID 的原因。
在1980年之前,奥斯陆没有夏令时,而布鲁塞尔有。因此,在 70 年代,它们并不"相同"——从某种意义上说,它们没有使用相同的偏移量规则(不仅是使用的偏移量,还有 DST 更改发生的确切时刻)。直到1980年之后,奥斯陆才开始使用与布鲁塞尔相同的规则,因此现在它们可以被认为是"相同的"。
检查 2 个或更多时区是否"相等"时,必须设置参考日期或要考虑的日期间隔。因为不同的 IANA 标识符意味着,在历史的某个时刻,会有所不同。
不要忘记时区可能一直在变化,因为它们是由政府定义的——通常没有技术原因。因此,您也不能保证未来的日期:如果布鲁塞尔或奥斯陆的政治家决定更改他们国家/地区的规则(例如">从现在开始我们将没有 DST">或"标准偏移量现在将是 X,在 DST 期间将是 Y">,或者"我们将保留 DST,但它在不同的日期开始和结束",等等)?
时刻JS
如果要使用区域的短名称,例如"CET"和">CEST"(用于"中欧时间"和"中欧夏令时"),则可以将momentjs库与momentjs时区一起使用,并使用abbr
方法检查区域的短名称。
但是你还有另一个问题:许多这些短名称是模棱两可的(IST被印度,以色列和爱尔兰使用,CST在中国,古巴和美国的中部时间使用,等等),所以仅仅检查它们是不够的(如评论中所指出的)。因此,您还必须使用utcOffset
方法检查偏移量。
但请注意,这些方法需要一个时间戳作为参考,因为它们在时区的历史记录中检查当时使用的名称和偏移量。因此,您始终需要使用参考日期(或日期间隔)来了解 2 个时区是否"相同"。
实际上,您使用哪个 API 并不重要,您必须始终使用一些参考日期来了解要比较的时区是否具有相同的规则/名称/偏移量/您使用的任何标准。
CET是一个涵盖许多国家的综合名称。不仅如此,每个国家都在不同的日期采用了它。而且,正如我之前所说,这总是会在未来发生变化(一些国家可能会更改为 CET/CEST,或者决定不使用 CEST,或者更改为与 CET 不同的另一个偏移量,甚至更改 CEST 开始和/或结束的日期;无论如何,这是一个不断变化的列表 - 只是因为今天的 2 个区域"相同", 这并不意味着他们过去总是这样,也不能保证他们将来会保持不变)。
因此,根据您检查的日期,2 个时区可以相同也可能不相同。无法检查"与日期无关的相等性"。