2016-05-25 24 views
0

我有一個工作流,需要將日期值作爲輸入,編輯它並以確切格式傳遞給輸出。 爲了管理這個任務,我用這個:Java無法解析的日期:以毫秒爲單位的不同字符數

TimeZone tz = TimeZone.getTimeZone("UTC"); 
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
df.setTimeZone(tz); 
long date = df.parse(inputDate).getTime() + 1; 
outputDate = df.format(date).toString(); 

大部分的時間這段代碼工作得很好。但是,有時我得到輸入日期如下:

2016-05-25T22:00:10.6Z 

請注意爲MS的字符數,它是3.1,而不是

在類似上述情況下,我得到異常:

java.text.ParseException: Unparseable date: "2016-05-25T22:00:10.6Z" 
      at java.text.DateFormat.parse(DateFormat.java:366) 

有沒有辦法讓我影響輸入日期,但我需要在毫秒部分正好三個數字。我如何獲得它?

回答

1

可以使用捕捉ParseException的和解析日期:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX"); 

例子:

public static void main(String[] args) throws ParseException { 
    TimeZone tz = TimeZone.getTimeZone("UTC"); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX"); 

    df.setTimeZone(tz); 
    df2.setTimeZone(tz); 

    long date; 
    String dateToParse = "2016-05-25T22:00:10.6Z"; 
    try { 
     date = df.parse(dateToParse).getTime() + 1; 
    }catch (ParseException e){ 
     System.out.println("exception"); 
     date = df2.parse(dateToParse).getTime() + 1; 

    } 
    System.out.println(df.format(date)); 
} 
2

用於解析,其實你可以像這樣指定一個字母(每場):

DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.SX"); 
// "2016-5-25T22:0:10.6Z" input is acceptable 
// "2016-05-25T22:00:10.6Z" input is acceptable 
// "2016-05-25T22:00:10.678Z" input is NOT acceptable 

它解析時接受多個數字(對於每個字段);這意味着對於解析(但是對於格式化它是重要的),模式字母的數量不是重要的。所以,像"2016-05-25T22:00:10.6Z"這樣的輸入對於上面的模式是可以接受的。但是,似乎在Java 8中存在一些實現問題(我不太清楚)或者可能有某些未記錄的內容,因此模式中連續的毫秒和時區(例如,SXSSSX)不是那簡單。我的意思是"2016-05-25T22:00:10.678Z"不是由模式可以接受的上方,非連續一個是可以接受的,就像這樣:

DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.S X"); // notice the space 
// "2016-5-25T22:0:10.6 Z" input is acceptable 
// "2016-05-25T22:00:10.6 Z" input is acceptable 
// "2016-05-25T22:00:10.678 Z" input is acceptable 

解決方法是,如果你的輸入已經連續毫秒和時區(之間沒有空格),創建多個DateFormat和catch例外。

DateFormat df1 = new SimpleDateFormat("y-M-d'T'H:m:s.SX"); 
DateFormat df2 = new SimpleDateFormat("y-M-d'T'H:m:s.SSX"); 
DateFormat df3 = new SimpleDateFormat("y-M-d'T'H:m:s.SSSX"); 
try { 
    result = df1.parse(inputDate); // first attempt 
} catch (ParseException e1) { 
    try { 
     result = df2.parse(inputDate); // second attempt 
    } catch (ParseException e2) { 
     result = df3.parse(inputDate); // last attempt, dead if fails 
    } 
} 

是,這種解決方法一種污垢:d。

相關問題