35

日付を 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);

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

4

4 に答える 4

61

あなたの日付形式は意味がないと思います。13:00 PM はありません。形式の末尾にある「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);

「Thu Apr 29 13:00:14 CEST 2010」と表示されます。

于 2010-04-29T06:31:39.437 に答える
5

SimpleDateFormat のようなものを使いたいと思うかもしれません。 http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

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

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

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

于 2010-04-29T06:03:34.430 に答える
2

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

于 2010-04-29T05:59:40.993 に答える
0

java.time

2010 年にjava.util.Dateは が ( および と一緒DateFormatCalendar) 私たち全員が使用したクラスでしたが、これらのクラスは常に設計が不十分であり、現在では時代遅れになっています。今日では、Java の最新の日付と時刻の API である java.time を使用します。

        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

コードで何が問題になったのですか?

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

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

小文字hhは AM または PM 内の時間 (01 から 12) を表すため、AM/PM マーカーが必要です。

その他のヒント

  • あなたのデータベースでは、SQLite には組み込みの datetime 型がないことを理解しているので、たとえば、標準の ISO 8601 形式を使用し、時刻を UTC で保存します2010-04-29T07:30:14Z(最新のInstantクラスは、そのような文字列をデフォルトとして解析およびフォーマットします。つまり、明示的なフォーマッターなし)。
  • GMT+05:30タイムゾーンなどのオフセットを使用しないでください。Asia/Colombo、Asia/Kolkata、America/New_York などのリアルタイム ゾーンを優先します。
  • 古い を使用したい場合DateFormat、そのparseメソッドは を返すDateので、 in のキャストは必要ありませんDate lNextDate = (Date)lFormatter.parse(lNextDate);

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

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

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

リンク

于 2019-02-09T09:02:29.620 に答える