Java XMLGregoriaCalendar日期格式';年月日HH:MM:ss.SSS';

Java XMLGregoriaCalendar日期格式';年月日HH:MM:ss.SSS';,java,xml,date,Java,Xml,Date,我正在尝试格式化XMLGregorianCalendar日期。 上述代码格式适用于格式“yyyy-MM-dd'T'HH:MM:ss'Z'” 但是对于formatBdd/MM/yyyy HH:MM:ss.SSS它会抛出错误 String formatA ="yyyy-MM-dd'T'HH:mm:ss'Z'"; String formatB = "dd/MM/yyyy HH:mm:ss.SSS"; try { XMLGregorianCalendar gregFmt = DatatypeFa

我正在尝试格式化XMLGregorianCalendar日期。 上述代码格式适用于格式
“yyyy-MM-dd'T'HH:MM:ss'Z'”

但是对于formatB
dd/MM/yyyy HH:MM:ss.SSS
它会抛出错误

String formatA ="yyyy-MM-dd'T'HH:mm:ss'Z'";
String formatB = "dd/MM/yyyy HH:mm:ss.SSS";
try {
    XMLGregorianCalendar gregFmt = DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat(formatB).format(new Date()));
    System.out.println(gregFmt);
} catch (DatatypeConfigurationException e) {
};
建议如何修复它。非常感谢你

日志

线程“main”java.lang.IllegalArgumentException中的异常:23/08/2017 16:13:04.140 位于com.sun.org.apache.xerces.internal.jaxp.datatype.xmlgoriancalendarimpl$Parser.parseAndSetYear(xmlgoriancalendarimpl.java:2887) 在com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(XMLGregorianCalendarImpl.java:2773) 在com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.(XMLGregorianCalendarImpl.java:435) 在com.sun.org.apache.xerces.internal.jaxp.datatype.datatypefactorympl.newxmlgoriancalendar(datatypefactorympl.java:536)上 位于test.test.main(test.java:19)
第19行是第4行,在上面的代码“XMLGregorianCalendar gregFmt…”

中描述了
newXMLGregorianCalendar(字符串)
接受的格式,它与您尝试使用的
formatB
不同。

使用
newXMLGregorianCalendar(字符串)的格式
accept在中有描述,它与您尝试使用的
formatB
不同。

tl;博士
  • 日期时间对象没有“格式”。它们解析并生成
    String
    对象,这些对象以文本形式表示它们的值
  • 使用现代java.time,它取代了可怕的旧类
    Date
    &
    xmlgoriiancalendar
例如:

Exception in thread "main" java.lang.IllegalArgumentException: 23/08/2017 16:13:04.140
at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parseAndSetYear(XMLGregorianCalendarImpl.java:2887)
at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(XMLGregorianCalendarImpl.java:2773)
at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.<init>(XMLGregorianCalendarImpl.java:435)
at com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar(DatatypeFactoryImpl.java:536)
at test.test.main(test.java:19)
2018年7月7日15:20:14.372

日期时间对象没有格式 不要将日期时间对象与它们生成的字符串合并以表示其值。日期时间值,包括下面讨论的类,不是
字符串
,不使用文本作为其内部值,也没有“格式”。它们都可以生成和解析字符串来表示它们的日期时间值

java.time 现代方法使用java.time类取代了旧的遗留日期时间类,如

java.util.Date
的使用应替换为
java.time.Instant
。两者都代表UTC中的一个时刻<代码>即时使用纳秒而非毫秒的更精细分辨率

您可以轻松地在现代类和传统类之间进行转换。在本例中,请注意添加到旧类中的新转换方法

首先从转换为

现在离开这些遗留类,进入java.time

GregorianCalendar gc = myXMLGregorianCalendar.toGregorianCalendar() ;
到目前为止,所有三种类型,即
XMLGregorianCalendar
GregorianCalendar
,以及
ZoneDateTime
都表示相同的时刻,一个日期,一天中的某个时间和一个指定的时区

有了
ZonedDateTime
,您可以生成标准ISO 8601格式的字符串,扩展后将时区名称附加到方括号中

ZonedDateTime zdt = gc.toZonedDateTime() ;
2018-07-07T15:20:14.372-07:00[美国/洛杉矶]

您可以使用
DateTimeFormatter
class以其他格式生成字符串。对于问题中第二个列出的格式模式,请定义一个匹配的
DateTimeFormatter
对象

String output = zdt.toString() ;  // Generate string in standard ISO 8601 format extended by appending the name of time zone in square brackets.
2018年7月7日15:20:14.372

问题中列出的第一个格式模式末尾有一个
Z
,表示UTC,发音为“Zulu”。要将我们的
ZonedDateTime
调整为UTC,只需提取一个
Instant
对象。根据定义,
即时
始终为UTC

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss.SSS" ) ;
String output = zdt.format( f ) ;
按照问题中首先显示的模式生成字符串

Instant instant = zdt.toInstant() ;  // Extract an `Instant` object, always in UTC.
2018-07-07T22:20:14.372Z


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(tl;dr
      • 日期时间对象没有“格式”。它们解析并生成以文本形式表示其值的
        String
        对象
      • 使用现代java.time,它取代了可怕的旧类
        Date
        &
        xmlgoriiancalendar
      例如:

      Exception in thread "main" java.lang.IllegalArgumentException: 23/08/2017 16:13:04.140
      at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parseAndSetYear(XMLGregorianCalendarImpl.java:2887)
      at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(XMLGregorianCalendarImpl.java:2773)
      at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.<init>(XMLGregorianCalendarImpl.java:435)
      at com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar(DatatypeFactoryImpl.java:536)
      at test.test.main(test.java:19)
      
      2018年7月7日15:20:14.372

      日期时间对象没有格式 不要将日期时间对象与其生成的字符串合并以表示其值。日期时间值(包括下面讨论的类)不是
      字符串
      ,不使用文本作为其内部值,也没有“格式”。所有这些对象都可以生成和解析字符串以表示其日期时间值

      java.time 现代方法使用java.time类取代了旧的遗留日期时间类,如

      java.util.Date
      的使用应替换为
      java.time.Instant
      。两者都代表UTC中的一个时刻。
      Instant
      使用纳秒而非毫秒的更精细分辨率

      您可以轻松地在现代类和传统类之间进行转换。请注意,在本例中,在旧类中添加了新的转换方法

      首先从转换为

      N
      Instant instant = zdt.toInstant() ;  // Extract an `Instant` object, always in UTC.
      
      String output = instant.toString() ;  // Generate string in standard ISO 8601 format.