2010-09-01 17 views
8

Ciąg Chcę formatu wygląda następująco: String datetime = "01/09/10 11:34:35 AM"Nie można przeanalizować DateTime stringi z AM/PM markera

Po wzorzec dla prac SimpleDateFormat :

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss"); 
Date d = sdf.parse(datetime); 
System.out.println(d); 

Output> [Wed Sep 01 11:34:35 CEST 2010] 

jednak muszę przeanalizować AM/PM marker, jak również, a gdy dodać, że do wzoru otrzymuję wyjątek.

wzór, który nie działa:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a"); 

Próbowałem z tym również z samym wyjątek:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa"); 

Wyjątek:

java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM" 

Szukałem przez API pod numerem http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text, ale wydaje się, że nie wiem, co robię źle.

Wszelkie sugestie?

+0

zarówno "a" i "aa" działają dla mnie. jaka jest twoja wersja java? – Bozho

Odpowiedz

25

Jedna z możliwości polega na tym, że domyślny Locale ma różne symbole dla AM/PM. Przy konstruowaniu format daty zawsze należy dostarczyć Locale chyba że naprawdę chcesz korzystać z domyślnego systemu Locale, np .:

SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US) 
+1

Dzięki za wskazanie tego. Ma sens i rozwiązuje mój problem. – aksamit

+1

Lekcja tutaj polega na tym, że podczas wykonywania pracy w trybie daty i godziny ** zawsze określ pożądane/oczekiwane ustawienia regionalne i strefę czasową **. Jeśli zostanie pominięte, oznacza to, że domyślnie używasz domyślnej maszyny JVM. Dodatkowa wskazówka: Google "Joda-Time" i "java.time". –

+0

Byłoby miło, gdyby komunikat o wyjątku był nie tylko "Nie można oddzielić daty", ale także pozycję w łańcuchu, w którym nie udało się ... – golimar

0

Jeśli pracujesz z FreeMarker Java i pop na tej użytku emisyjnej poniżej kodu. Miałem ten problem, mój zestaw ustawień narodowych AM/PM jako DE. Nie wiem, dlaczego ... <#setting locale="en_US">

3

Podejmuję przykład daty podanej poniżej i wypisuję sformatowaną datę w formacie 24-godzinnym, jeśli odpowiada Twoim wymaganiom.

String inputdate="9/1/10 11:34:35 AM"; 
     SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yy hh:mm:ss aa",Locale.getDefault()); 
     try { 
      System.out.println(""+new SimpleDateFormat("dd/MM/yy HH:mm:ss",Locale.getDefault()).format(simpleDateFormat.parse(inputdate))); 

     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

Jeśli nadal masz jakieś pytanie, proszę odpowiedzieć. Dzięki.

0

Nowoczesne odpowiedź:

String datetime = "9/1/10 11:34:35 AM"; 
    LocalDateTime dt = LocalDateTime.parse(datetime, 
      DateTimeFormatter.ofPattern("M/d/yy h:mm:ss a", Locale.ENGLISH)); 

ten wytwarza LocalDateTime z 2010-09-01T11: 34: 35. Uważaj jednak na dwie cyfry lat; DateTimeFormatter przyjmie wartość od 2000 do 2099. Na moje urodziny byłoby to nieprawidłowe.

Nadal musimy podać lokalizację. Ponieważ znaczniki AM/PM są prawie nieużywane w praktyce w innych lokalizacjach niż angielski, uznałem, że Locale.ENGLISH jest dość bezpiecznym zakładem. Proszę zastąpić własną.

Pozostałe odpowiedzi to były dobre odpowiedzi w 2010 i 2011 roku. Już w 2014 roku powyższe było ważne i wolałbym je.

Powiązane problemy