簡體   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