我有一个关于 XML Schema 的内置类型的问题 xsd:dateTime
.xsd:dateTime
的确切语义是什么?没有时区?前任。 1970-01-01T00:00:00
.
我已经阅读了许多 XML 架构规范文档,但无法找到应该如何处理它。
具体来说,我想了解如何转换xsd:dateTime
到日期(如 java.util.Date
或 JavaScript Date
)对象正确。
旁注:我非常了解 Java util 类,例如 DatatypeConverter
或 DatatypeFactory
,我想找到定义如何进行这种转换的 XML 架构规范。Date
的问题类(在 Java 中以及在 JavaScript 中)是这些类确实有时区(默认为本地时区)。如果我收到 xsd:dateTime
如果没有输入时区,那么我必须以某种方式决定,我应该假设哪个时区。否则我无法将其转换为时区值(如 Date
)。
现在的问题是,我应该假设什么。我在这里看到以下选项:
我真的不喜欢第二种选择。这完全是随机的!在我的机器上,如果我运行
System.out.println(DATATYPE_FACTORY
.newXMLGregorianCalendar("1970-01-01T00:00:00")
.toGregorianCalendar().getTime().getTime());
对于 GMT+1、GMT 或 GMT-1,我会得到 -3600000, 0, 3600000(还有更多取决于夏季时间的变体。这太随意了,我真的不明白。这是否意味着比我们有带有类似元素的 XML 文档
<date-time>1970-01-01T00:00:00</date-time>
我们实际上不知道,究竟指的是哪个时间瞬间?
第一个选项(假设 UTC)对我来说似乎更有效,但这显然不是(至少)Java 工具正在做的。
所以请有人给我一个指向某种定义无时区语义的规范的指针
xsd:dateTime
?谢谢你。
更新:
目前的调查结果是:
xsd:dateTime
to Date 具有特定时区的对象 - 除非以某种方式假设不存在时区。 我的解决方案如下:
context
提供 XML 处理上下文的对象(类似于 JAXB JAXBContext
)。我将使用类似 getDefaultTimezoneOffset()
的方法扩展这个对象。和 setDefaultTimezoneOffset(int timezoneOffset)
0
(UTC) 目前。但是也可以是本地时区(就像 Java 工具那样)。 xsd:dateTime
至 Date
,如果传入值缺少时区,则假定为 context.getDefaultTimezoneOffset()
. originalTimezoneOffset
这样的属性中或类似的东西。这不会修改 Date
的值对象,但会提供一些额外的上下文信息(例如,何时应该再次打印该值)。 Date
时,图书馆会检查 originalTimezoneOffset
如果提供,则在呈现词法值时考虑它。 最佳答案
基本上时区是缺席信息,有很多方法可以解释缺席信息;最后取决于你。可能的解释是:
XPath/XQuery/XSLT 系列规范假定一个上下文定义的时区。这里的上下文可以是用户的语言环境,或者运行软件的机器的时区,或者任何数量的其他东西。
从某种意义上说,这与省略时间并只给出日期没有什么不同。当你说你出生于 1973 年 3 月 21 日时,你到底是什么意思?你说的是哪个时区?假设可能是您遗漏了信息,因为没有人可能会在意。
关于xml - xsd :dateTime without timezone and its conversion to Date 的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518217/