web-dev-qa-db-ja.com

文字列をJava.util.Dateに変換

次の形式でSQLiteデータベースに日付を保存しています。

d-MMM-yyyy,HH:mm:ss aaa

その形式で日付を取得すると、時間を除くすべてのものが正常に取得されます。時間は常に00。出力は次のとおりです。

String date--->29-Apr-2010,13:00:14 PM
After convrting Date--->1272479414000--Thu Apr 29 00:00:14 GMT+05:30 2010

コードは次のとおりです。

    Date lScheduledDate = CalendarObj.getTime();
    DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    SomeClassObj.setTime(formatter.format(lScheduledDate));

    String lNextDate = SomeClassObj.getTime();
    DateFormat lFormatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    Date lNextDate = (Date)lFormatter.parse(lNextDate);
    System.out.println("output here"+lNextDate);

私は何を間違えていますか?

29

あなたの日付形式は意味をなさないと思います。午後13:00はありません。フォーマットの最後にある「aaa」を削除するか、HHをhhに変換します。

それにもかかわらず、これは私にとってはうまくいきます:

String testDate = "29-Apr-2010,13:00:14 PM";
DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
Date date = formatter.parse(testDate);
System.out.println(date);

「2010年4月29日13:00:14 CEST 2010」と印刷されます。

55
Thomas Lötzer

SimpleDateFormatのようなものを使用したいようです。 http://Java.Sun.com/j2se/1.4.2/docs/api/Java/text/SimpleDateFormat.html

日付形式を宣言してから、文字列を使用して解析メソッドを呼び出します。

private static final DateFormat DF = new SimpleDateFormat(...);
Date myDate = DF.parse("1234");

そして、ギヨームが言うように、タイムゾーンを設定してください!

5
azp74

DateFormatでTimeZoneを設定する必要があります。設定しない場合、デフォルトの値が使用されます(コンピューターの設定によって異なります)。

2
Guillaume

Java.time

2010年には、Java.util.Dateがすべて使用したクラス(DateFormatおよびCalendarと共に)でしたが、これらのクラスは常に不十分に設計され、現在では古くなっています。今日では、Java.timeを使用します。これは、最新のJava日時APIです。

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy,HH:mm:ss");

        String dateTimeStringFromSqlite = "29-Apr-2010,13:00:14";
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStringFromSqlite, formatter);
        System.out.println("output here: " + dateTime);

出力は次のとおりです。

ここに出力:2010-04-29T13:00:14

あなたのコードで何が間違っていましたか?

HHは時間帯であり、aaaからAM/PMマーカーをレンダリングするため、フォーマットパターン文字列の大文字のHHaaaの組み合わせはあまり意味がありません。ただし、害を及ぼすことはありません。あなたが報告した正確な結果を再現することはできませんでした。いずれにせよ、あなたのコメントは、昔ながらのSimpleDateFormatを使用するか、現代のDateTimeFormatterを使用するかに関係なく重要です。

「aaa」は使用しないでください。「aaa」を使用する場合は「hh」を指定してください

小文字のhhは、午前または午後の01〜12の時間であるため、午前/午後マーカーが必要です。

その他のヒント

  • データベースでは、SQLiteには組み込みの日時型がないことを理解しているため、標準のISO 8601形式を使用し、UTCで時刻を保存します。たとえば、2010-04-29T07:30:14Z(現代のInstantクラスは、そのデフォルト、つまり、明示的なフォーマッタなし)。
  • タイムゾーンにGMT+05:30などのオフセットを使用しないでください。アジア/コロンボ、アジア/コルカタ、アメリカ/ニューヨークなどのリアルタイムゾーンを優先します。
  • 古いDateFormatを使用する場合、そのparseメソッドはDateを返すため、Date lNextDate = (Date)lFormatter.parse(lNextDate);でキャストする必要はありません。

質問:AndroidでJava.timeを使用できますか?

はい、Java.timeは古いものと新しいものでうまく動作しますAndroidデバイス。少なくともJava 6が必要です。

  • Java 8以降および新しいAndroidデバイス(APIレベル26以降)では、最新のAPIが組み込まれています。
  • Java 6および7は、モダンクラスのバックポートであるThreeTenバックポートを取得します(JSR 310のスリーテン。下部のリンクを参照)。
  • オン(古い)Android ThreeTenバックポートのAndroidエディションを使用します。ThreeTenABPと呼ばれます。そして、サブパッケージでorg.threeten.bpから日時クラスをインポートしてください。

リンク集

0
Ole V.V.