2016-09-30 10 views
10

Co jest nie tak w tym kodzie? Próbuję przeanalizować format daty, który ma 0 między latami i miesiącami.Nie można odczytać daty z dodatkowym numerem w Javie

import java.text.SimpleDateFormat; 

class Main { 
    public static void main(String[] args) { 
     SimpleDateFormat format = new SimpleDateFormat("yyyy'0'MMdd"); 
     try { 
      Date date = format.parse("201600101"); 
      System.out.println(date); 
     } catch (Exception ex) { 
      System.out.println(ex.getMessage()); 
     } 
    } 
} 

To wyjdzie Nie można odczytać daty: "201600101". Jeśli zmienię "0" na cokolwiek innego niż numer [np. 'X' i format.parse ("2016X0101")] to zadziała.

+5

Domyślam się, że rok "20160". "yyyy" może wynosić 2,3,4,5 cyfra roku. –

+0

Jeśli znasz format, który nakazowo, dlaczego nie po prostu usunąć dodatkowe zero? –

+0

To interesujące. Wydaje się działać, po dodaniu spacji, np. Wzorzec "rrrr" 0'MMdd jest interpretowany zgodnie z oczekiwaniami. –

Odpowiedz

3

Jak Peter Lawrey powiedział, że Java widzi '20160' jako rok. można rozwiązać problemu poprzez modyfikację "201600101" do, na przykład, 2016-00101 i byłaby format tupot jak

SimpleDateFormat format = new SimpleDateFormat("yyyy-'0'MMdd"); 

Będzie analizowania datę.

1

Korzystanie z biblioteki, w której można użyć stałych szerokości czterech cyfr na rok, wystarczy. Przykład java.time -package w Javie-8

String input = "201600101"; 

    DateTimeFormatter dtf = 
     new DateTimeFormatterBuilder() 
      .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER) 
      .appendLiteral('0') 
      .appendPattern("MMdd") 
      .toFormatter(); 
    LocalDate date = LocalDate.parse(input, dtf); 
    System.out.println(date); // 2016-01-01 

ta ma silną przewagę nie być zmuszony do zmiany sygnału wejściowego. Zawsze lepiej jest zmienić formater. Z pewnością nie jest to możliwe z SimpleDateFormat.

Powiązane problemy