簡體   English   中英

Java 8 DateTime格式日期+偏移量

[英]Java 8 DateTime Format Date + Offset

我必須為XMLGregorianCalendar服務構造一個XMLGregorianCalendar ,它希望日期格式為yyyy-MM-dd+01:00 ,其中+之后的值是從時區offsett派生的。

到目前為止,我已經嘗試過:

DateTimeFormatter formatterDateWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-ddZZ");

XMLGregorianCalendar xcal = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar(zonedDateTime.format(formatterDateWithOffset));

但是這會導致IllegalArgumentExcpetion因為格式化程序會生成2017-09-29+0200

是否可以為所需格式定義格式字符串?

如果您查看DateTimeFormatter上的JavaDoc,您會看到:

偏移X和x:根據模式字母的數量格式化偏移。 一個字母僅輸出小時,例如'+01',除非分鍾非零,在這種情況下分鍾也輸出,例如'+0130'。 兩個字母輸出小時和分鍾,沒有冒號,例如'+0130'。 三個字母輸出小時和分鍾,帶有冒號,例如'+01:30'。 ...當要輸出的偏移量為零時,模式字母“X”(大寫)將輸出“Z”,而模式字母“x”(小寫)將輸出“+00”,“+ 0000”或'+00:00'。

因此DateTimeFormatter formatterDateWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-ddxxx"); 應該管用。

在我的評論中,我建議使用ZZZZ因為JavaDoc也暗示了這一點,但它也會添加GMT部分(即使JavaDoc聲明, ZZZZZ似乎也能正常工作:“五個字母輸出小時,分鍾, 如果非零 ,可選 ,用冒號“)。

您可以創建XMLGregorianCalendar的實例,而不是解析您傳遞給它的年,月等:

XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(year, month....)

正如@ Thomas的回答所說,一種替代方法是使用xxx (或XXX ),如javadoc中所述 它們之間的唯一區別是當偏移量為零時: XXX格式為Z ,而xxx格式為+00:00

Pattern  Count  Equivalent builder methods
-------  -----  --------------------------
XXX      3      appendOffset("+HH:MM","Z")
xxx      3      appendOffset("+HH:MM","+00:00")

無論如何,只需選擇其中一個(我已經使用ZonedDateTimeZoneOffset.UTC進行了測試,兩者都有效):

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-ddXXX");
String str = formatter.format(zonedDateTime);
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(str);

如果您有ZonedDateTime ,則將其轉換為GregorianCalendar更容易,然后將其傳遞給您的DatatypeFactory

ZonedDateTime zonedDateTime = ZonedDateTime.now();
GregorianCalendar cal = GregorianCalendar.from(zonedDateTime);
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);

一個棘手的細節是,當使用上面的String模式(只有日期)時,結果將時間字段(小時,分鍾,秒和毫秒)設置為零,而轉換為GregorianCalendar將使用在ZonedDateTime

但您可以將時間設置為午夜,然后再將其轉換為GregorianCalendar

// convert to calendar (set the time to 00:00:00.000)
GregorianCalendar cal = GregorianCalendar.from(zonedDateTime.with(LocalTime.MIDNIGHT));

這樣,結果將與使用String相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM