2016-08-09 125 views
1

我處理字符串,如下面的冗餘信息:0022 GMT (0822 HKT) July 21, 2016解析與喬達時間

顯然,這些字符串指定一天的時間兩次,兩個不同的時區。 Joda Time的DateTimeFormat.forPattern()的模式語法可以處理這種冗餘信息嗎?

一種可能性是忽略兩個時間表達式0022 GMT0822 HKT中的一個。這需要某種通配符,它​​可以匹配時間表達式的一部分以被忽略,看起來像Hm z '(*)' MMM dd, y

在Joda Time的模式語法中是否存在可以解析上述時間字符串的通配符或其他任何內容?

回答

1

爲了忽略潛在矛盾的部分(重複在其他區的小時,分​​鍾和區域名稱),你必須寫自己的DateTimeParser喬達時間

DateTimeFormatter dtf = 
    new DateTimeFormatterBuilder().appendPattern("HHmm 'GMT' (").append(
     new DateTimeParser() { 
      @Override 
      public int estimateParsedLength() { 
       return 10; 
      } 
      @Override 
      public int parseInto(DateTimeParserBucket bucket, String text, int position) { 
       int pos = position; 
       while (text.charAt(pos) != ')') { 
        pos++; 
       } 
       return pos; 
      } 
     } 
    ) 
    .appendPattern(") MMMM dd, yyyy") 
    .toFormatter() 
    .withLocale(Locale.US) 
    .withZoneUTC(); 

String input = "0022 GMT (0822 HKT) July 21, 2016";  
DateTime dt = dtf.parseDateTime(input); 
System.out.println("Joda: " + dt); // 2016-07-21T00:22:00.000Z 

爲了您的信息,我沒有辦法在Java-8(沒有輸入預處理)的情況下執行此操作,請參閱此示例,即使使用可選部分,該示例也會拋出異常。 Java-8缺乏一種編寫自己的解析器的機制。

DateTimeFormatter dtf = 
    DateTimeFormatter.ofPattern("HHmm z ([HHmm z]) MMMM dd, uuuu", Locale.US); 
ZonedDateTime zdt = ZonedDateTime.parse(input, dtf); // throws exception!!! 
// java.time.format.DateTimeParseException: 
// Text '0022 GMT (0822 HKT) July 21, 2016' could not be parsed at index 10 

邊注:當你可能會探索我的圖書館Time4J它提供了一個可供選擇,適合更高性能的解析引擎的Java-8,那麼它提供了比喬達時更容易的解決方案,看到這個小gist example

否則寫一個使用hackish的解決方法串預處理始終是可能的(有趣的時,不允許第三方庫):

String input = "0022 GMT (0822 HKT) July 21, 2016"; 
StringBuilder sb = new StringBuilder(); 
boolean markedForRemoval = false; 
for (int i = 0; i < input.length(); i++) { 
    char c = input.charAt(i); 
    if (c == ')') { 
     markedForRemoval = false; 
    } 
    if (!markedForRemoval) { 
     sb.append(c); 
    } 
    if (c == '(') { 
     markedForRemoval = true; 
    } 
} 
input = sb.toString(); 
System.out.println(input); // 0022 GMT() July 21, 2016 
// continue parsing the changed input based on a formatter of your choice