2015-06-08 48 views
9

我想解析:2014-05-02-10.45.05.993280-5:00其中-5:00是UTC的偏移量。在Java 8中使用java.time DateTimeFormatterjava.timeTimeTimeFormatter時區偏移模式

對於第一位,我有以下內容:yyyy-MM-dd-HH.mm.ss.SSSSSS但是,我無法弄清楚模式應該解析偏移量。

如果我有4位數字的偏移量(-05:00),我可以使用:yyyy-MM-dd-HH.mm.ss.SSSSSSxxx,但這不適用於3位數字。

任何想法?

+1

您正在使用哪個版本的Java? –

+0

@JonSkeet - 對不起,更新了原文。 – Cheetah

回答

9

使用大寫字母X而不是x,因此XXX。不同之處在於,大X可以將輸入字母「Z」識別爲UTC-Offset +00:00,而小字母X不能。

建議圖案:

yyyy-MM-dd-HH.mm.ss.SSSSSSXXX 

請也意識到以下JDK-bug的:

java.time.format.DateTimeFormatter無法解析單 位數小時的偏移

更新:

我現在已經在錯誤日誌中測試了描述的解決方法。

String input = "2014-05-02-10.45.05.993280-5:00"; 
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter(); 
System.out.println(f.parse(input, ZonedDateTime::from)); 

但它拋出一個異常:線程 「main」 java.time.format.DateTimeParseException

例外: 文本「2014-05-02-10.45.05.993280-5: 00'無法在索引26 上的java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 位於HelloWorld.main處的java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) (你好,世界。java:16)

因此,從寬鬆的解析也沒有幫助。 所以現在只有三個選項留給你:

  • 使用。解決方法由臭蟲記者建議:[...]解決方法是單獨解析日期/時間,使用手工編碼解析器偏移並將LocalDateTime與手解析的偏移量相結合。不是一件容易的工作。

  • 試試你自己的專門的字符串預處理。如果你有一個固定的格式,那麼你可以嘗試在位置26插入零數字(如果總輸入長度是一個數字太小)。

  • 或者你使用一個外部庫,它可以做到這一點。我的庫Time4J(v4.0)可以做到這一點,如果你願意添加額外的依賴。看到這個代碼:

String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();

更新:根據JDK-錯誤狀態,該錯誤已修復了Java的9,但對於Java的8一個補丁包,似乎並沒有被儘管如此。

+0

該模式不起作用......但鏈接到bug看起來像我的問題。我嘗試了建設者的建議,但這似乎也沒有工作。 – Cheetah

+0

@Cheetah你是對的。對不起,你遭受了這個錯誤。如果您可以使用任何替代解決方法,請參閱我的更新。 –

2

偏移量SimpleDateFormat標誌是Z檢查Java7Java8SimpleDateFormat API

然後,String

2014-05-02-10.45.05.993280-5:00 

解析器格式必須爲:

yyyy-MM-dd-HH.mm.ss.SSSSSSZ 

UPDATE:爲DateTimeFormatter偏移模式用於格式化和解析是:

O  localized zone-offset  offset-O   GMT+8; GMT+08:00; UTC-08:00; 
X  zone-offset 'Z' for zero offset-X   Z; -08; -0830; -08:30; -083015; -08:30:15; 
x  zone-offset     offset-x   +0000; -08; -0830; -08:30; -083015; -08:30:15; 
Z  zone-offset     offset-Z   +0000; -0800; -08:00; 

DateTimeFormatter您需要的圖案是X

+0

我正在使用'DateTimeFormatter'並添加一個'Z'不會顯示爲工作 – Cheetah

+1

您鏈接到Java 7兩次。 [Java 8 API在這裏](http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) – dcsohl