[英]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")
無論如何,只需選擇其中一個(我已經使用ZonedDateTime
和ZoneOffset.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.