web-dev-qa-db-ja.com

AM / PMマーカーを使用してDateTime文字列を解析できません

フォーマットする文字列は次のようになります。Stringdatetime= "9/1/10 11:34:35 AM"

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]

ただし、AM/PMマーカーも解析する必要があり、それをパターンに追加すると、例外が発生します。

動作しないパターン:

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

私はこれも同じ例外を除いて試しました:

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

例外:

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

http://download.Oracle.com/javase/1.4.2/docs/api/Java/text/SimpleDateFormat.html#text でAPIを調べましたが、どこにあるのかわかりません。間違ってください。

助言がありますか?

18
aksamit

1つの可能性は、デフォルトのLocaleのAM/PMの記号が異なることです。日付形式を作成するときは、システムのデフォルトのLocaleを本当に使用したい場合を除いて、常にLocaleを指定する必要があります。例:

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

以下に示す日付の例を取り上げ、要件に合う場合は、フォーマットされた日付を24時間形式で印刷します。

 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();
        }

それでも質問がある場合は、返信してください。ありがとう。

3
droidd

現代の答え:

    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));

これにより、2010-09-01T11:34:35のLocalDateTimeが生成されます。ただし、2桁の年に注意してください。 DateTimeFormatterは2000年から2099年までを想定しています。私の誕生日の場合、これは正しくありませんでした。

ロケールを指定する必要があります。 AM/PMマーカーは英語以外のロケールでは実際にはほとんど使用されないため、Locale.ENGLISHはかなり安全な方法だと思いました。自分で代用してください。

他の答えは2010年と2011年の良い答えでした。すでに2014年に上記は有効であり、私はそれを好んだでしょう。

1
Ole V.V.

FreeMarker for Javaで、この問題をポップする場合は、以下のコードを使用してください。この問題が発生したため、ロケールでAM/PMがDEに設定されました。理由はわかりません...<#setting locale="en_US">

0
Marek Tuchalski