次の形式で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);
私は何を間違えていますか?
あなたの日付形式は意味をなさないと思います。午後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」と印刷されます。
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");
そして、ギヨームが言うように、タイムゾーンを設定してください!
DateFormatでTimeZoneを設定する必要があります。設定しない場合、デフォルトの値が使用されます(コンピューターの設定によって異なります)。
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マーカーをレンダリングするため、フォーマットパターン文字列の大文字のHH
とaaa
の組み合わせはあまり意味がありません。ただし、害を及ぼすことはありません。あなたが報告した正確な結果を再現することはできませんでした。いずれにせよ、あなたのコメントは、昔ながらのSimpleDateFormat
を使用するか、現代のDateTimeFormatter
を使用するかに関係なく重要です。
「aaa」は使用しないでください。「aaa」を使用する場合は「hh」を指定してください
小文字のhh
は、午前または午後の01〜12の時間であるため、午前/午後マーカーが必要です。
その他のヒント
2010-04-29T07:30:14Z
(現代のInstant
クラスは、そのデフォルト、つまり、明示的なフォーマッタなし)。GMT+05:30
などのオフセットを使用しないでください。アジア/コロンボ、アジア/コルカタ、アメリカ/ニューヨークなどのリアルタイムゾーンを優先します。DateFormat
を使用する場合、そのparse
メソッドはDate
を返すため、Date lNextDate = (Date)lFormatter.parse(lNextDate);
でキャストする必要はありません。はい、Java.timeは古いものと新しいものでうまく動作しますAndroidデバイス。少なくともJava 6が必要です。
org.threeten.bp
から日時クラスをインポートしてください。Java.time
の使用方法の説明。Java.time
が最初に記述された場所。Java.time
のバックポートJava 6および7(JSR-310用のThreeTen))。