繁体   English   中英

XMLGregorianCalendar日期格式'dd / MM / yyyy HH:mm:ss.SSS'

[英]XMLGregorianCalendar date format '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) {
};

我正在尝试合并XMLGregorianCalendar date。 上面的代码很好地格式化了格式"yyyy-MM-dd'T'HH:mm:ss'Z'"

但是对于formatB dd/MM/yyyy HH:mm:ss.SSS它会引发错误

java.lang.IllegalArgumentException

对如何修复提出建议。 非常感谢!

日志

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)

第19行是第4行,在上面的代码'XMLGregorianCalendar gregFmt ...'中

XML规范中描述了newXMLGregorianCalendar(string)接受的格式,该格式不同于您尝试使用的formatB

TL;博士

  • 日期时间对象没有“格式”。 它们解析并生成以文本形式表示其值的String对象。
  • 使用现代的java.time替换了可怕的旧类DateXMLGregorianCalendar类。

例:

myXMLGregorianCalendar   // If you must use this class… but try to avoid. Use *java.time* classes instead.
.toGregorianCalendar()   // Converting from `javax.xml.datatype.XMLGregorianCalendar` to `java.util.GregorianCalendar`.
.toZonedDateTime()       // Converting from `java.util.GregorianCalendar` to `java.time.ZonedDateTime`, from legacy class to modern class.
.format(                 // Generate a `String` representing the moment stored in our `ZonedDateTime` object.
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss.SSS" )  // Define a formatting pattern as you desire. Or better, automatically localize by calling `DateTimeFormatter.ofLocalized…` methods.
)                        // Returns a `String` object, distinct from our `ZonedDateTime` object.

07/07/2018 15:20:14.372

日期时间对象没有格式

不要将日期时间对象与它们生成的代表其值的字符串相混淆。 日期时间值(包括以下讨论的类)不是String ,不将文本用作其内部值,并且没有“格式”。 它们都可以生成并解析字符串以表示其日期时间值。

java.time

现代方法使用了java.time类, 该类取代了麻烦的旧旧日期时间类,例如XMLGregorianCalendar

应该将java.util.Date的使用替换为java.time.Instant 两者都代表UTC的时刻。 Instant使用更好的分辨率,而不是毫秒。

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

首先将javax.xml.datatype.XMLGregorianCalendar转换为java.util.GregorianCalendar

GregorianCalendar gc = myXMLGregorianCalendar.toGregorianCalendar() ;

现在摆脱这些遗留类,进入java.time。

ZonedDateTime zdt = gc.toZonedDateTime() ;

到目前为止,所有这三种类型, XMLGregorianCalendarGregorianCalendarZonedDateTime都表示相同的时刻,带有日期的日期和指定的时区。

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

String output = zdt.toString() ;  // Generate string in standard ISO 8601 format extended by appending the name of time zone in square brackets.

2018-07-07T15:20:14.372-07:00 [美国/洛杉矶]

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

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss.SSS" ) ;
String output = zdt.format( f ) ;

07/07/2018 15:20:14.372

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

Instant instant = zdt.toInstant() ;  // Extract an `Instant` object, always in UTC.

按照问题中首先显示的模式生成字符串。

String output = instant.toString() ;  // Generate string in standard ISO 8601 format.

2018-07-07T22:20:14.372Z


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM