2016-05-06 4 views
5
DateFormat formatter = new SimpleDateFormat("hh:mmaa"); 
formatter.parse("01:20pm") 

Ich versuche, im Format von 01:20 Uhr zu parsen. Wenn ich den obigen Code ausführen, bekomme ich die folgende Ausnahme:Parsing einfache Zeiten in hh: Mmaa Format

java.text.ParseException: Unparseable date: "01:20pm" 
    at java.text.DateFormat.parse(DateFormat.java:366) 

Was das Format, das ich in der Simple Konstruktor setzen, ich sehe nichts falsch. Was ist hier schief gelaufen?

+2

Vielleicht ist es locale Problem ist? Was ist dein Standard? Versuchen Sie, Locale.US –

+0

zu übergeben, welche Version von JDK verwenden Sie, das funktioniert ziemlich gut mit JDK_1.8 –

+0

Herr, war es ein lokales Problem !!!! Was zum .. Warum in aller Welt wäre hier ein Problem? Gibt es tatsächlich andere Locales, die hh interpretieren: mmaa sehr unterschiedlich? – Xiagua

Antwort

7

Ihr Systemgebietsschema muss AM/PM nicht erkennen. Verwenden Sie eine Locale, die dies tut. So etwas wie,

DateFormat formatter = new SimpleDateFormat("hh:mmaa", Locale.US); 

Oder in Java 8+, verwenden Sie die neuen java.time API wie

LocalTime lt = LocalTime.parse("01:20pm", 
     DateTimeFormatter.ofPattern("hh:mmaa", Locale.US)); 
+1

Es war ein Gebietsschema Problem. 10 Punkte für Java – Xiagua

1

Nummer und Datum Parsing in Java verwendet das Locale angeben, na ja, länderspezifische Symbole. In diesem Fall wird meistens der Wert pm abgelehnt.

Um dies zu bestätigen, ist hier ein Codeabschnitt, um alle verfügbaren Gebietsschemas in der VM auszuüben.

Für Locales, die nicht funktionieren, war ich neugierig zu sehen, warum, also statt eine Zeit zu analysieren, formatiere ich stattdessen eine gültige Zeit. Musste die UTF-8-Ausgabe aktivieren, aber es ist interessant zu sehen.

Der wirklich interessante Teil ist, dass all Spanisch (es) locales, außer die Vereinigten Staaten Variante (es_US) funktioniert gut. Hmmm ........

Set<String> good = new TreeSet<>(); 
Set<String> bad = new TreeSet<>(); 
for (Locale locale : Locale.getAvailableLocales()) { 
    try { 
     new SimpleDateFormat("hh:mmaa", locale).parse("01:20pm"); 
     good.add(locale.toLanguageTag()); 
    } catch (ParseException e) { 
     bad.add(locale.toLanguageTag()); 
    } 
} 
System.out.println("Good locales: " + good); 

Date time = new SimpleDateFormat("hh:mmaa", Locale.ENGLISH).parse("01:20pm"); 
System.out.println("Bad locales:"); 
for (String languageTag : bad) 
    System.out.printf(" %-5s: %s%n", languageTag, new SimpleDateFormat("hh:mmaa", Locale.forLanguageTag(languageTag)).format(time)); 

OUTPUT

Good locales: [be, be-BY, bg, bg-BG, ca, ca-ES, da, da-DK, de, de-AT, de-CH, de-DE, de-GR, de-LU, en, en-AU, en-CA, en-GB, en-IE, en-IN, en-MT, en-NZ, en-PH, en-SG, en-US, en-ZA, es, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EC, es-ES, es-GT, es-HN, es-MX, es-NI, es-PA, es-PE, es-PR, es-PY, es-SV, es-UY, es-VE, et, et-EE, fr, fr-BE, fr-CA, fr-CH, fr-FR, fr-LU, he, he-IL, hi, hr, hr-HR, id, id-ID, is, is-IS, it, it-CH, it-IT, lt, lt-LT, lv, lv-LV, mk, mk-MK, ms, ms-MY, nl, nl-BE, nl-NL, nn-NO, no, no-NO, pl, pl-PL, pt, pt-BR, pt-PT, ro, ro-RO, ru, ru-RU, sk, sk-SK, sl, sl-SI, sr, sr-BA, sr-CS, sr-Latn, sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-ME, sr-RS, tr, tr-TR, uk, uk-UA, und] 
Bad locales: 
    ar : 01:20م 
    ar-AE: 01:20م 
    ar-BH: 01:20م 
    ar-DZ: 01:20م 
    ar-EG: 01:20م 
    ar-IQ: 01:20م 
    ar-JO: 01:20م 
    ar-KW: 01:20م 
    ar-LB: 01:20م 
    ar-LY: 01:20م 
    ar-MA: 01:20م 
    ar-OM: 01:20م 
    ar-QA: 01:20م 
    ar-SA: 01:20م 
    ar-SD: 01:20م 
    ar-SY: 01:20م 
    ar-TN: 01:20م 
    ar-YE: 01:20م 
    cs : 01:20odp. 
    cs-CZ: 01:20odp. 
    el : 01:20μμ 
    el-CY: 01:20ΜΜ 
    el-GR: 01:20μμ 
    es-US: 01:20p.m. 
    fi : 01:20ip. 
    fi-FI: 01:20ip. 
    ga : 01:20p.m. 
    ga-IE: 01:20p.m. 
    hi-IN: ०१:२०अपराह्न 
    hu : 01:20DU 
    hu-HU: 01:20DU 
    ja : 01:20午後 
    ja-JP: 01:20午後 
    ja-JP-u-ca-japanese-x-lvariant-JP: 01:20午後 
    ko : 01:20오후 
    ko-KR: 01:20오후 
    mt : 01:20WN 
    mt-MT: 01:20WN 
    sq : 01:20MD 
    sq-AL: 01:20MD 
    sv : 01:20em 
    sv-SE: 01:20em 
    th : 01:20หลังเที่ยง 
    th-TH: 01:20หลังเที่ยง 
    th-TH-u-nu-thai-x-lvariant-TH: ๐๑:๒๐หลังเที่ยง 
    vi : 01:20CH 
    vi-VN: 01:20CH 
    zh : 01:20下午 
    zh-CN: 01:20下午 
    zh-HK: 01:20下午 
    zh-SG: 01:20下午 
    zh-TW: 01:20下午