【发布时间】:2015-02-05 19:33:37
【问题描述】:
我正在尝试将有效的ISO 8601 字符串转换为一致的格式,以便可以使用简单的字典顺序进行排序和搜索。
我的应用程序可以接收以下任何格式的日期/时间,例如:
2015-02-05T02:05:17.000+00:00
2015-02-05T02:05:17+00:00
2015-02-05T02:05:17Z
这些都代表相同的日期/时间,我想将它们全部转换为规范形式进行存储,例如:
2015-02-05T02:05:17.000Z
我的第一个想法是使用Converting ISO 8601-compliant String to java.util.Date 中的技术来解析它们,然后转换回所需的字符串,但是在处理不太精确的日期/时间时会出现问题,例如:
2015-02-05T02:05:17Z
2015-02-05T02:05Z
2015-02-05Z
2015-02Z
2015Z
应该保留这些时间的不精确性。它们不应转换为:
2015-02-05T00:00:00.000Z
我看过 Java 8 和 Joda-Time,但他们似乎希望将所有内容都视为特定的时间点,并且无法对不精确的性质或部分日期/时间进行建模。
更新:
使用 Java 8,我可以做到:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17+00:00");
System.out.println(dateTime.toString());
这给了我:
2015-02-05T02:05:17Z
这是我想要的,但是:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17.000+00:00");
System.out.println(dateTime.toString());
也给了我:
2015-02-05T02:05:17Z
请注意,java 已经抛弃了毫秒精度。指定 000 被视为与不指定任何内容相同,这似乎不太正确。
【问题讨论】:
-
2015-02-05T02:05:17+0000不是有效的 ISO 日期。 -
维基百科建议 +0000 是一个有效的偏移量。你有更好的参考吗?
-
我认为没有一个对象可以保存您定义的限制(即部分精度)的日期。所以你最好的选择是使用你自己的代表。
-
@JamesScriven,如果 WP 这么说,那就错了。您要么以扩展格式或以标准格式提供所有部分,但没有以混合方式提供。请参阅我在泽西岛的comment。如果你愿意,我可以引用 ISO 8601 的章节。
-
@Michael-O 基本符号和扩展符号之间的区别在我的脑海中并不清楚。我已经更新了问题以删除不良示例。谢谢。