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

私は午後1時20分の形式で時刻を解析しようとしています。私は上記のコードを実行すると、私は次の例外を取得:私の知る限りのSimpleDateFormatのコンストラクタに入れフォーマットとしてhh:mmaa形式の単純な構文解析

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

を、私が間違って何も表示されません。何がここで間違っていた?

+2

は、ロケールの問題だことができますか?あなたのデフォルトでは何ですか? Locale.USを渡すようにしてください –

+0

JDKのどのバージョンを使用していますか?JDK_1.8でこれはかなりうまく動作します –

+0

主よ、ロケールの問題です!!!!何が地上でなぜロケールがここで問題になるのでしょうか?実際にhh:mmaaを広く解釈する他のロケールはありますか? – Xiagua

答えて

7

システムロケールは、AM/PMを認識しないでください。その場合はLocaleを使用してください。何かのように、

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

または、Javaの8+では、Javaでのような新しいjava.time APIを使用

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

ロケールの問題でした。 10 JAVAのためのポイント – Xiagua

1

番号と日付の解析は、よく、ロケール固有の記号を指定するロケールを使用しています。この場合、大部分は拒否されている値のpmです。

これを確認するには、VM内のすべての使用可能なロケールを実行するコードを作成します。

ロケールが機能しない場合は、理由を知りたいのですが、時間を解析する代わりに、有効な時刻をフォーマットします。 UTF-8出力を有効にする必要がありましたが、面白いことです。

本当に興味深いのは、スペイン語(es)ロケール、以外のアメリカ系(es_US)が問題なく機能するということです。うーん........

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下午 
関連する問題