xml - xsd :dateTime without timezone and its conversion to Date 的语义

标签 xml datetime jaxb xsd timezone

我有一个关于 XML Schema 的内置类型的问题 xsd:dateTime .
xsd:dateTime 的确切语义是什么?没有时区?前任。 1970-01-01T00:00:00 .

我已经阅读了许多 XML 架构规范文档,但无法找到应该如何处理它。

具体来说,我想了解如何转换xsd:dateTime到日期(如 java.util.Date 或 JavaScript Date )对象正确。

旁注:我非常了解 Java util 类,例如 DatatypeConverterDatatypeFactory ,我想找到定义如何进行这种转换的 XML 架构规范。
Date 的问题类(在 Java 中以及在 JavaScript 中)是这些类确实有时区(默认为本地时区)。如果我收到 xsd:dateTime如果没有输入时区,那么我必须以某种方式决定,我应该假设哪个时区。否则我无法将其转换为时区值(如 Date )。

现在的问题是,我应该假设什么。我在这里看到以下选项:

  • 假设一些默认的东西,比如 UTC。
  • 假设处理器的本地时区。

  • 我真的不喜欢第二种选择。这完全是随机的!在我的机器上,如果我运行
    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 ?

    谢谢你。

    更新:

    目前的调查结果是:
  • 未指定时区与“未指定”时区的语义完全相同,也就是说,您不能盲目地假设 UTC 或处理器的本地时区或其他什么。这是一些本地时区,但您不知道是哪个时区。
  • 这基本上意味着严格来说你不能转换 xsd:dateTime to Date 具有特定时区的对象 - 除非以某种方式假设不存在时区。
  • 作为工具提供者,我无法真正做出这种明智的假设。我没有数据或其语义方面的背景。
  • 这使我得出结论,工具用户必须提供这样的假设——无论是明确的还是隐含的。

  • 我的解决方案如下:
  • 在我的图书馆里,我有一个所谓的 context提供 XML 处理上下文的对象(类似于 JAXB JAXBContext)。我将使用类似 getDefaultTimezoneOffset() 的方法扩展这个对象。和 setDefaultTimezoneOffset(int timezoneOffset)
  • 默认情况下,此方法将返回一些默认值。我更喜欢 0 (UTC) 目前。但是也可以是本地时区(就像 Java 工具那样)。
  • 欢迎库用户提供不同的默认时区偏移量,但这不是严格要求的(此处为“隐式”假设)
  • 解析时xsd:dateTimeDate ,如果传入值缺少时区,则假定为 context.getDefaultTimezoneOffset() .
  • 我还将注意解析的 Date 对象中的传入时区(或缺少时区)。例如在像 originalTimezoneOffset 这样的属性中或类似的东西。这不会修改 Date 的值对象,但会提供一些额外的上下文信息(例如,何时应该再次打印该值)。
  • 打印 Date 时,图书馆会检查 originalTimezoneOffset如果提供,则在呈现词法值时考虑它。
  • 最佳答案

    基本上时区是缺席信息,有很多方法可以解释缺席信息;最后取决于你。可能的解释是:

  • 时区未知
  • 时区可以从上下文中建立,例如相关地点
  • 时区为 UTC

  • XPath/XQuery/XSLT 系列规范假定一个上下文定义的时区。这里的上下文可以是用户的语言环境,或者运行软件的机器的时区,或者任何数量的其他东西。

    从某种意义上说,这与省略时间并只给出日期没有什么不同。当你说你出生于 1973 年 3 月 21 日时,你到底是什么意思?你说的是哪个时区?假设可能是您遗漏了信息,因为没有人可能会在意。

    关于xml - xsd :dateTime without timezone and its conversion to Date 的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518217/

    相关文章:

    xml - JAXB 中 UnMarshaller 和 Parser 的区别

    android - radiogroup 的自定义圆形样式

    python - Pandas系列在Python中按月份索引排序(时间序列不同)

    java - 无法加载“类路径资源 [org/springframework/ws/client/core/WebServiceTemplate.properties]

    java - 使用 JAXB 从 MAP 创建 XML

    c# - 加载 xml 文档失败并带有特殊字符 »

    c# - 如何将 SqlDateTime 值转换为 .Net::DateTime

    mysql - 在此 SQL 示例中,INTERVAL 的用法是否正确?

    java - JAXB - 无法获取某些对象信息

    soap - CXF 响应具有不合格的命名空间