lex*_*ore 5 xml timezone datetime xsd jaxb
我有一个关于XML Schema的内置类型的问题xsd:dateTime。
xsd:dateTime没有时区的确切语义是什么?例如 1970-01-01T00:00:00。
我已经阅读了许多XML Schema规范文档,但是找不到如何处理它。
具体来说,我想了解如何正确地转换xsd:dateTime为Date 对象(如like java.util.Date或JavaScript Date)。
旁注:我非常了解Java util类,例如DatatypeConverter或DatatypeFactory,我想找到定义如何进行此转换的XML Schema规范。
Date该类的问题(在Java和JavaScript中)是这些类确实具有时区(默认为本地时区)。如果我xsd:dateTime在输入中遇到了没有时区的问题,那么我就不得不以某种方式离开,我应该假设哪个时区。否则,我无法将其转换为时区值(如Date)。
现在的问题是,我应该假设什么。我在这里看到以下选项:
我真的不喜欢第二种选择。这完全是随机的!在我的机器上,如果我运行
System.out.println(DATATYPE_FACTORY
.newXMLGregorianCalendar("1970-01-01T00:00:00")
.toGregorianCalendar().getTime().getTime());
Run Code Online (Sandbox Code Playgroud)
对于GMT + 1,GMT或GMT-1,我将得到-3600000、0、3600000(以及更多变体,具体取决于夏季时间。这是如此武断,我真的没有得到。这是否意味着当我们拥有具有以下元素的XML文档
<date-time>1970-01-01T00:00:00</date-time>
Run Code Online (Sandbox Code Playgroud)
我们实际上不知道,确切的时间瞬间是什么意思?
第一种选择(假设UTC)对我来说似乎更有效,但这显然不是(至少)Java工具正在做的事情。
因此,能否有人给我一个指向规范的指针,该规范定义了无时区的语义xsd:dateTime?
谢谢。
更新:
当前的发现是:
xsd:dateTime为具有特定时区的Date对象-除非以某种方式对不存在的时区进行了假设。我的解决方案如下:
context对象,它提供XML游行上下文(JAXB的模拟JAXBContext)。我将使用诸如getDefaultTimezoneOffset()和的方法扩展该对象。setDefaultTimezoneOffset(int timezoneOffset)0(UTC)。但是也可以是本地时区(就像Java工具一样)。xsd:dateTime到Date,如果传入的值是缺少一个时区,它将被假定为context.getDefaultTimezoneOffset()。originalTimezoneOffset中。这不会修改Date对象的值,但会提供一些其他上下文信息(例如,何时应再次打印该值)。Date,库将检查originalTimezoneOffset和,如果提供了lexical值,请考虑使用它。基本上时区是缺席信息,缺席信息有很多种解释方式;最终取决于你。可能的解释是:
时区未知
时区可以根据上下文建立,例如相关的地点
时区是 UTC
XPath/XQuery/XSLT 系列规范假定上下文定义的时区。这里的上下文可以是用户的区域设置,或者运行软件的计算机的时区,或者任何其他东西。
从某种意义上说,这与省略时间并仅给出日期没有什么不同。当你说你出生于 1973 年 3 月 21 日时,你到底是什么意思?你说的是哪个时区?假设您可能遗漏了这些信息,因为没有人会关心。