没有时区的xsd:dateTime的确切语义是什么?防爆. 1970-01-01T00:00:00.
我已阅读了许多XML Schema规范文档,但无法知道如何处理它.
具体来说,我想了解如何正确地将xsd:dateTime转换为Date(如java.util.Date或JavaScript Date)对象.
旁注:我完全了解Java util类,如DatatypeConverter或DatatypeFactory,我想找到定义如何进行此转换的XML Schema规范.
Date类(在Java中以及在JavaScript中)的问题是这些类确实有时区(默认为本地时区).如果我在输入时得到没有时区的xsd:dateTime,那么我必须以某种方式决定,我应该假设哪个时区.否则我只是无法将其转换为timezoned值(如Date).
现在问题是,我应该假设什么.我在这里看到以下选项:
>假设像UTC这样的默认值.
>假设处理器的本地时区.
我真的不喜欢第二种选择.这完全是随机的!在我的机器上,如果我跑
System.out.println(DATATYPE_FACTORY .newXMLGregorianCalendar("1970-01-01T00:00:00") .toGregorianCalendar().getTime().getTime());
我会得到-3600000,0,360000 GMT 1,GMT或GMT-1(甚至更多变种取决于夏令时.这是如此随意,我真的没有得到这个.这是否意味着比我们有一个带有元素的XML文档
<date-time>1970-01-01T00:00:00</date-time>
我们实际上不知道,这究竟是什么时间段的意思?
第一个选项(假设UTC)对我来说似乎更有效,但这显然不是(至少)Java工具正在做的事情.
所以可以请某人给我一个指针,指出某种定义无时区xsd:dateTime语义的规范?
谢谢.
更新:
目前的发现是:
>未指定的时区具有“未指定”时区的语义,也就是说,您不能盲目地假设处理器的UTC或本地时区或其他任何区域.这是一些当地时区,但哪一个 – 你真的不知道.
>这基本上意味着严格来说,你不能将xsd:dateTime转换为具有特定时区的Date对象 – 除非以某种方式做出关于缺席时区的假设.
>作为工具提供者,我无法真正做出明智的假设.我没有关于数据或其语义的背景知识.
>这使我得出结论,工具用户必须明确或隐含地提供这样的假设.
我的解决方案如下:
>在我的库中,我有一个所谓的上下文对象,它提供了XML处理上下文(类似于JAXB JAXBContext).我将使用getDefaultTimezoneOffset()和setDefaultTimezoneOffset(int timezoneOffset)等方法扩展此对象
>默认情况下,此方法将返回一些默认值.我现在更喜欢0(UTC).但也可以是本地时区(如Java工具).
>欢迎图书馆用户提供不同的默认时区偏移量,但不是严格要求的(此处为“隐式”假设)
>将xsd:dateTime解析为Date时,如果传入的值缺少时区,则将其假定为context.getDefaultTimezoneOffset().
>我还会在解析的Date对象中记下传入的时区(或缺少它).例如,在诸如originalTimezoneOffset之类的属性中或类似的东西.这不会修改Date对象的值,但会提供一些额外的上下文信息(例如,应该再次打印值时).
>打印日期时,库将检查originalTimezoneOffset,如果提供它,则在渲染词法值时考虑它.
>时区不详
>时区可以从上下文建立,例如一个相关的地方
>时区是UTC
XPath / XQuery / XSLT规范系列假定了一个上下文定义的时区.这里的上下文可以是用户的区域设置,或运行软件的机器的时区,或任何其他数量的东西.
从某种意义上说,它与省略时间和仅给出日期没有什么不同.当你说你出生于1973年3月21日时,你究竟是什么意思?你在说什么时区?假设您可能遗漏了这些信息,因为没有人可能会关心这些信息.