在JavaScript(在浏览器中运行)中,我有continent/location
形式的两个时区。 如何确定它们是否属于同一时区?
请注意,仅检查当前偏移量不起作用。这两个时区可能是不同的区域,恰好具有相同的偏移今天。我可以检查一年中每一天的补偿,但这听起来不太可行。
示例:
Europe/Oslo
和Europe/Brussels
是相同的(欧洲中部时间/欧洲中部夏令时)。Europe/Oslo
和Europe/London
不一样。答案 0 :(得分:5)
continent/location
格式的标识符来自IANA database。在此数据库中,每个标识符代表相应区域在历史记录中具有(并且已经拥有)的所有偏移的列表。
Europe/Oslo
和Europe/Brussels
可能是"相同"今天,但他们的补偿历史并不完全相同 - 实际上,这就是为什么IANA为每个人分配了不同的ID。
1980年之前,Oslo didn't have Daylight Saving Time,而Brussels had。所以,在70年代,他们并没有相同的" - 从某种意义上说,他们没有使用相同的偏移规则(不仅使用偏移量,而且还有DST变化发生的确切时刻)。 Only after 1980,奥斯陆开始使用same rules of Brussels,所以现在他们可以被认为是#34;同样的"。
当检查2个或更多时区是否等于"时,您必须设置参考日期或要考虑的日期间隔。因为不同的IANA标识符意味着,在历史的某个时刻,会产生差异。
并且不要忘记时区可能会一直在变化,因为它们是由政府定义的 - 通常没有技术原因。所以你也不能保证未来的日期:如果布鲁塞尔或奥斯陆的政治家决定改变他们国家的规则(例如"我们从现在开始没有获得DST,那该怎么办?在" 或"标准偏移现在是X,在DST期间将是Y" ,或"我们'保持DST,但它在不同的日期开始和结束" 等)?
如果您想使用区域的简称,例如" CET"和" CEST" (对于"中欧时间"以及"中欧夏令时"),您可以momentjs library使用momentjs timezone,并检查区域的简短名称使用abbr
method。
但是你还有另一个问题:many of those short names are ambiguous( IST 被印度,以色列和爱尔兰使用, CST 在中国,古巴和美国使用&# 39; s中部时间等,所以只检查它们是不够的(如评论中所指出的)。因此,您还必须check the offset using the utcOffset
method。
但请注意,这些方法需要时间戳作为参考,因为它们会检查时区的历史记录,了解当时的名称和偏移量。因此,您始终需要使用参考日期(或日期间隔)来了解2个时区是否相同"相同"。
实际上,使用哪种API并不重要,您必须始终使用一些参考日期来了解所比较的时区是否具有相同的规则/名称/偏移/您使用的任何条件。
CET是covers lots of countries的综合名称。不仅如此,each country adopted it in a different date。而且,正如我之前所说,未来总会有变化(有些国家可能会改为CET / CEST,或者决定不使用CEST,或者更改为与CET不同的其他偏移,甚至更改CEST启动时的日期和/或结束;无论如何,这是一个不断变化的清单 - 只是因为2个区域是相同的"今天,它并不意味着它们在过去总是这样,而{{ 3}})。
因此,根据您检查的日期,2个时区可以相同或不同。没有办法检查"与日期无关的平等"。