xml – 没有时区的xsd:dateTime的语义及其转换为Date

我有一个关于 XML Schema的内置类型xsd:dateTime的问题.

没有时区的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,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日时,你究竟是什么意思?你在说什么时区?假设您可能遗漏了这些信息,因为没有人可能会关心这些信息.

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念