我们尝试使用时区偏移量解析以下ISO 8601 DateTime字符串:
final String input = "2022-03-17T23:00:00.000+0000";
OffsetDateTime.parse(input);
LocalDateTime.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
Run Code Online (Sandbox Code Playgroud)
由于时区偏移中的冒号,两种方法都失败(这OffsetDateTime也是有意义的DateTimeFormatter.ISO_OFFSET_DATE_TIME).
java.time.format.DateTimeParseException:无法在索引23处解析文本'2022-03-17T23:00:00.000 + 0000'
但根据维基百科,时区偏移有4种有效格式:
<time>Z
<time>±hh:mm
<time>±hhmm
<time>±hh
Run Code Online (Sandbox Code Playgroud)
其他框架/语言可以解析这个字符串而没有任何问题,例如Javascript Date()或Jacksons ISO8601Utils(他们在这里讨论这个问题)
现在我们可以DateTimeFormatter使用复杂的RegEx 编写自己的,但在我看来,java.time库应该能够默认解析这个有效的ISO 8601字符串,因为它是有效的.
现在我们使用Jacksons ISO8601DateFormat,但我们更愿意使用官方date.time库来使用.你有什么方法可以解决这个问题?
我有以下格式的数千个日期:
2011-10-02T23:25:42Z (又名ISO 8601 in UTC)
我应该使用什么MySQL数据类型在MySQL数据库中存储这样的ISO8601日期?例如Datetime,timestamp或其他什么?
哪个最适合比较(例如,在两个日期/时间之间获取记录)并从查询中排序结果?如果数据库非常大呢?
什么是将上述PHP字符串转换为MySQL存储的最佳方法?(我猜date_default_timezone_set('UTC');是会用的?)
该Time.iso8601方法是ISO-8601的受限子集.
看起来没有一个类可以处理所有各种8601日期和日期/时间组合.但是,我设法通过使用Date.parse和Time.iso8601方法解决问题.缺点是你需要在代码中决定输入是看起来像日期还是日期/时间.
Time.iso8601并且Time.parse行为不同.
>> Time.parse("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 18:27:00 +0100 2010
>> Time.iso8601("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 17:27:00 UTC 2010
Run Code Online (Sandbox Code Playgroud)
本文档涉及ISO-8601中的内容与Ruby支持的内容之间的差异.简短的回答是可能的格式数量受到限制.
我一直在尝试将日期值转换为更易读的格式.为此,我试图使用JavaScript Date.parse()方法解析日期.然而,这对"2007-09-21T14:15:34.058-07:00"我所拥有的输入(例如:)不起作用.最终目标是输出日期字符串"January 30th, 2008 @ 2:15PM".
有任何想法吗?
我想把两次加在一起.ISO 8601时间戳是'1984-06-02T19:05:00.000Z',我想将其转换为秒.我尝试使用Python模块iso8601,但它只是一个解析器.
有什么建议?
我可以使用以下方法轻松地将Delphi TDate转换为ISO 8601格式:
DateTimeToString(result, 'yyyy-mm-dd', myDate);
Run Code Online (Sandbox Code Playgroud)
进行逆转换的惯用方法是什么?StringToDateTime()似乎不存在.
显然,我可以通过手动解析字符串并对结果进行编码来实现"硬"方式,但这似乎是一个糟糕的选择.
如何验证ISO 8601日期字符串(例如:2011-10-02T23:25:42Z).
我知道ISO 8601日期有几种可能的表示形式,但我只想验证上面给出的格式作为例子.
谢谢!
不,我不是在谈论区域偏移 - 这些区域在一年中可能因基于例如夏令时的区域而变化.我在谈论IANA维护的实际时区.我理解ISO 8601 不支持这些,对吗?
什么平台在支持ISO 8601类似字符串表示中识别时区?我注意到最新的Java日期/时间库正在使用扩展的ISO 8601格式,例如2011-12-03T10:15:30+01:00[Europe/Paris].(请参阅DateTimeFormatter API.)
是否有一些融合约定(例如与其他语言和平台一起)用于扩展ISO 8601以支持时区指定?
我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题.我将概述我的具体用例,并向其他SO答案和网络上的信息提供摘要.
对于我正在编写的服务,数据库条目是在移动设备和我们的网站上创建和存储的,需要同时进行同步.我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库.服务器端使用Django和MySQL在Python中实现,但其他解决方案可能在将来取代它.
将按照此SO答案中概述的想法实施同步:https://stackoverflow.com/a/5052208/2076094.对于同步,我们将使用仅由服务器设置并同步到客户端的时间戳,用于创建和更新对象的last_synced_date和时间戳.由于对象引用用户在某些时间所做的事情,因此它们也具有时间戳信息.
我的问题只涉及用于这些时间戳的内部时间表示.UI中的用户表示是内部表示的本地化和格式化版本.在实现语言和用于表示时间戳的不同数据库中有许多不同的方式.经过相当多的研究后,似乎只剩下有效的解决方案了:
该文章这是Hacker News上(两次),建议使用UNIX时间,并提出一个相当不错的参数.正如所预料的那样,关于HN的讨论在上述两点以及一些点之间存在很大差异.
到目前为止,我的结论是,Unix时间戳更容易处理,但似乎不是Django的常用方法.几乎我发现的每个代码示例,从Django教程到很多其他站点,都在models.py中使用DateTimeField,它被映射到SQL中的某种日期字段,具体的术语取决于所使用的数据库.
使用ISO8601日期进行传输和存储的缺点是需要解析它们以创建相应的实现语言的日期类型.这并不难,但有点烦人.对于我们使用的每种语言,您需要一个(小)库或者至少需要比您希望的更多的代码.它不是很漂亮,创建依赖关系,可能会稍微慢一些.在我知道的任何语言中,Unix时间时间戳都没有这个问题.
另一件事是,您可以轻松地使用数据库中的"智能"日期或时间戳字段(以及解析期间).关于时间魔法的问题有很多问题可以解决问题.达到我的链接限制,所以我不能发布任何内容,但你很容易找到一些;)
我们可以使用不包含时区信息的简化格式,只使用UTC.我们只会使用UTC,但似乎如果你使用ISO8601,你也可以使用一种普遍理解和明确的格式.Unix时间始终是UTC,所以你永远不必担心.
当然ISO8601有被人类可读的,当你在原始数据库,我不会有2038前不久重写几行代码的优势,但是这似乎并没有弥补缺点.
似乎通过写出来我实际上已经得到了答案;)无论如何,我很想知道别人的想法以及你在自己的项目中做了什么.请简要介绍一下您的用例,以便其他人可以更好地对您的输入进行分类.
谢谢!
iso8601 ×10
datetime ×3
date ×2
java ×2
php ×2
bash ×1
date-format ×1
delphi ×1
javascript ×1
mysql ×1
python ×1
python-2.7 ×1
rfc3339 ×1
ruby ×1
time ×1
timestamp ×1
timezone ×1
validation ×1