2016-08-30 110 views
1

我有日期2016-03-30T23:59:59.000000+0000。我想知道這是什麼格式 ,因爲如果我用yyyy-MM-dd'T'HH:mm:ss.SSS,它拋出一個異常日期格式化問題+號

+0

'+ 0000'是時區偏移量。 – Jesper

回答

2

如果你真的有微秒從此零不同的我強烈建議不要使用SimpleDateFormat,而是使用Java-8-Time-API或另一個可處理微秒的時間庫。而且這並不是唯一一箇舊API被證明非常有限的情況。

SimpleDateFormat(破碎,毫秒消失!)反面教材:

String input = "2016-03-30T23:59:59.123456+0530"; 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println(sdf.format(sdf.parse(input))); // 2016-03-30T18:32:02.000456+0000 

Java的8例(作品):

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"); 
OffsetDateTime odt = OffsetDateTime.parse(input, dtf); 
System.out.println(odt); // 2016-03-30T23:59:59.123456+05:30 

如果你從來沒有微秒,但只有毫秒,想要堅持使用舊API,那麼你可以嘗試下面的破解:

String input = "2016-03-30T23:59:59.123000+0530"; 

    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'xxx'Z"); 
    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    sdf2.setTimeZone(TimeZone.getTimeZone("GMT")); 
    System.out.println(sdf2.format(sdf1.parse(input.replace("000", "xxx")))); 

2016-03-30T18:29:59.123 + 0000

然而,這個「解決方案」在2000年中斷了(你可以通過進一步的字符串預處理找到更好的解決方案),並且最終可用的微秒會丟失。所以在這裏使用SimpleDateFormat是一個壞主意。