2015-04-30 27 views
3

我有一個像下面的一些代碼:什麼Java日期格式正確解析?

import java.text.DateFormat; 
... 

this.timestampFormat = new SimpleDateFormat(timestampFormat, Locale.UK); 
this.timestampFormat.parse(modifyTimestamp.get().toString()); 

但解析拋出錯誤:

Caused by: java.text.ParseException: Unparseable date: "20150429142243.925Z" 

我想這兩個日期格式字符串:

yyyyMMddHHmmss'Z' 
yyyyMMddHHmmss'.0Z' 

的 「925Z」部分時間我認爲是問題所在。 在這種情況下,第二個日期格式字符串應該是正確的,儘管它不起作用。

+0

看來你的'timestampFormat'值與日期字符串不兼容。 – MaxZoom

回答

4

試試這個:

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss.SSS'Z'", Locale.UK); 

925毫秒,所以你需要SSS表示這一點。

+1

請查閱以供參考:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#iso8601timezone –

+1

這對我有效。謝謝。 –

+0

@GeorgeHernando: - 不客氣! –

4

您輸入的字符串也有milliseconds

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss.SSS'Z'", Locale.UK); 
0

喬達時間

類似公認的正確答案,但使用Joda-Time庫。

String input = "20150429142243.925Z"; 
DateTimeFormatter formatter = DateTimeFormat.forPattern ("yyyyMMddHHmmss.SSSZ"); 
DateTime dateTime = formatter.parseDateTime (input).withZone (DateTimeZone.UTC); 

語言環境不需要

沒有必要在這種情況下,Locale。只有在解析日期或月份的名稱等情況下才需要。只有數字和已知的順序,不需要區域設置。

不要confuse Locale for time zone。他們是正交的問題。如果您想要UK time zone,請使用proper time zone name(不要使用3或4個字母代碼)明確應用它。

示例代碼,再次使用Joda-Time 2.8。

dateTimeEuropeLondon = dateTime.withZone(DateTimeZone.forID("Europe/London") ; 

ISO 8601

如果字符串有日期部分和時間的日部分之間的T,它會遵從ISO 8601標準定義的基本格式。您可以使用內置於Joda-Time中的符合ISO的格式化程序之一,而不是明確指定模式。

String input = "20150429T142243.925Z"; // "T" separator inserted in middle. 
DateTime dateTime = DateTimeFormatter.basicDateTime().parseDateTime (input).withZone (DateTimeZone.UTC); 

java.time

的Java 8和更高版本來與繼任者喬達時間捆綁,在java.time框架(Tutorial)。

與Joda-Time不同,java.time預定義格式化程序沒有"basic" version省略了HYPHEN-MINUS和COLON字符。所以我們必須明確定義格式化程序的模式。

String input = "20150429142243.925Z"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSSX").withZone(ZoneOffset.UTC); 
ZonedDateTime zdt = ZonedDateTime.parse(input , formatter); 

轉儲到控制檯。

System.out.println("zdt : " + zdt); 

運行時。

zdt : 2015-04-29T14:22:43.925Z