我的API代表使用ISO 8601的客户的时间。我们有一个功能,我们想要显示它来自哪个时区。通过纯粹存储时区偏移量,我们无法跟踪该细节。
即,犹他州和亚利桑那州在一半的时间里观察MST -06:00
而犹他州在另一半中转向MDT -07:00
。我们目前的解决方案是确定日期是否在夏令时期间以及在*DT
期间使用*ST
时区,否则,但在亚利桑那州的ISO 8601日期将导致太平洋夏令时。
有没有办法指定是否以ISO 8601格式观察夏令时?像2016-01-11T13:00:04Z DST0
或类似的东西?
答案 0 :(得分:1)
我找不到使用ISO8601和RFC2822做得好的方法。我将时间存储在MySql数据库中 - 这个时间叫做“电视时间”。在本文https://stackoverflow.com/tags/timezone/info中。与夏令时不同时,电视时间与夏令时的UTC偏差不同 - 但是我的用户同时提到它。 EG:"我上午9点开始工作"不是"我在夏天22:00UTC开始工作,在冬天开始工作21:00UTC。
我的解决方案是在数据库中添加一个额外的字符串列(我将其命名为' tzid')并将此文本tzid存储在此列表https://unicode.org/cldr/charts/latest/supplemental/zone_tzid.html中(并在PHP中存储DateTimeZone :: listAbbreviations ()也列出了一个列表。日期时间存储在mysql DateTime列
中我大部分时间都在通过“电视时间”#39;从datetime列到我的应用程序,它只是呈现没有后果。如果我需要比较时区的时间或计算间隔时间,我可以使用tzid列转换为UTC。
答案 1 :(得分:1)
似乎ISO 8601:2004的新版本正在准备中,它已分为两部分,ISO 8601-1:201x(符合当前标准)和ISO 8601-2:201x(一个新的处理基本标准的各种扩展,例如不确定或未指定的时间,或超过4位数的年份等)。 Google搜索' iso 8601 pdf'出现Draft ISO 8601-1和Draft ISO 8601-2。由于这些日期从2016年开始,但ANSI网上商店仍然提供ISO 8601:2004(收费),它们还不是标准 - 标准仍然是ISO 8601:2004。
标准和草稿都不允许除UTC(±1030
或±10:30
之外的任何数字时区(虚构示例)或Z
(表示UTC,aka祖鲁时间 - 因为字母Z在NATO phonetic alphabet中被称为祖鲁语。
因此,ISO 8601没有直接指导。
时区是一个持续存在争议的话题,对他们来说并不简单。例如,在2018年2月,佛罗里达州通过立法,使其保持夏令时['一年左右;这是否会被允许还有待观察。 IANA托管(但不直接管理)奥尔森'时区数据库(以其原始创建者A. D. Olson命名)。您可以在https://www.iana.org/time-zones找到有关TZDB的信息。当前版本的数据库可供下载,有两个邮件列表,一个用于公告(一年几次),另一个用于正在进行的讨论(大多数日子,通常是一天中的多条消息)。 Unicode Consortium还有CLDR(公共区域设置数据存储库),它还处理传递的时区名称(它还处理区域设置的许多其他方面,并且它们是其主要目标,不是时区)。
即使在亚利桑那州,事情并不简单。亚利桑那州大部分地区不使用夏令时(夏令时),但纳瓦霍族确实使用夏令时,除了纳瓦霍国家内霍皮人国家的地区不使用夏令时。即使在适用时间的地方进行地理定位也可能无济于事。有些城市有两个不同的人口使用与UTC不同的时区偏移,即使两个偏移没有明显的区域。您几乎必须知道应该考虑将哪个时区应用于您正在录制的日期/时间值,并且没有100%可靠的方法来了解它。 (假设来自加利福尼亚的人正在欧洲旅行并与纽约,伦敦,罗马,悉尼和加尔各答的团队成员召开会议 - 哪个时区适用于会议?)
答案 2 :(得分:1)
ISO 8601在“时区”和“ UTC偏移”这两个术语之间非常顺滑(且误导)。
出于引用全局唯一时刻的目的,类似“ Thh:mm:ssZ + 01:00”的表示形式在以下方面非常有效:
如果您还想传达发件人的 locality , ,那么可以在8601结构的 outside 后面附加一个合适的位置字段。无需在时间字段中包含位置。
我个人希望看到ISO 8601取消了“时间区域”。
答案 3 :(得分:0)
我知道这越来越老了,我希望下面至少会刺激对话和想法。
所以,我认为这个问题的基础是ISO 8601的问题,它无法携带必要的信息来帮助实现夏时制转换。
前段时间我遇到了类似的问题,并与同事进行了许多“建设性”对话,讨论如何最好地解决夏令时中记录的日期问题,但是从没有夏时时的时区来看……我们一直在回圈符合ISO 8601标准,是解决日期和时间传输问题的主力,但它从未解决夏令时问题。
结论与许多人最终决定的结论相似,那就是使用ISO 8601来表示日期和时间(带有偏移)(即使它没有用),然后提供额外的数据来指示时区,日期和时间属于。这样一来,客户端渲染就可以提供时区以及ISO 8601,以给出实际正确的日期和时间,而与时区无关。
现在,这不是我想离开的地方……实际上,在其他人确信偏移量足够的情况下,我是保持ISO 8601时区漏洞讨论的少数人之一。就像您发现它不允许时区识别或将其精确转换为其他时区一样,因此我认为ISO 8601是带有时区传输格式的无效日期和时间。
以下内容在部分程度上是个玩笑,但当您认为它足以满足工作要求时,它也很严重... IOS 8601具有严格的格式可以遵循,因此,当您正确遵循它时,它就可以正常工作而没有缺陷。 ..
此页面提供了有关格式的详细信息,以及围绕时区的行星支持的一些愚蠢的笑话。 https://github.com/Gitapedia/AltSO-8601
我还有一个PHP扩展Carbon类,它支持解析和转换Altso 8601格式。 https://packagist.org/packages/mossengine/alteredcarbon 该软件包可以更好地插入Carbon软件包,但是扩展类足以至少显示概念证明。
似乎可以通过修订来改进ISO 8601格式,但是我等不及这么久,觉得偏移量是无用的,可以用时区代替,为什么我们需要所有的冒号和破折号和Ts和Zs,当我们可以将日期和时间连接在一起时,它仍然可读且较小,以允许提供时区所需的额外字节。
下一步是考虑(如果存在)支持短名称时区或进行发明,以便Altso 8601格式可以传输更少量的数据,并对日期和时间(特别是时区)有更深入的了解