5

私はこの質問に従います: Convert from java.util.date to JodaTime

私は日付を持っています:Sun Jan 01 00:00:00 CET 1854今、それをjoda日時に変換したい:

DateTime dateTime = new DateTime(日付);

そして今、私が得たこの日付を印刷すると:1853-12-31T23:57:44.000+00:57:44

何が間違っていて、なぜ私の日付が変わったのですか? どうすれば同じ日付を取得できますか?

アップデート:

カレンダーを使用して日付を取得します:

Calendar cal1 = Calendar.getInstance();
cal1.set(1854, 0, 1, 0, 0, 0);
cal1.getTime()

更新 2:

おそらくミリ秒に問題があります:

    Calendar cal1 = Calendar.getInstance();
    cal1.set(1854, 0, 1, 0, 0, 0);
    DateTime start = new DateTime(1854, 1, 1, 0, 0, 0);
    System.out.println(start.getMillis());
    System.out.println(cal1.getTime().getTime());

このコードが返すため:

-3660598664000
-3660598799438

しかし、私は理由を知りません

更新3:

ここに画像の説明を入力

4

5 に答える 5

8

Joda-Time は正確なタイム ゾーン データベースを使用します。このデータベースには、タイムゾーンが始まる何年も前の地方平均時 (LMT)があります。ウィキペディアを引用するには:

地方平均時は、特定の経度で均一な時間スケールを形成して、地方の見かけの時間の変動を修正する太陽時の形式です。

JDK は LMT を使用しないため、時間が異なります。

于 2012-09-13T11:33:36.377 に答える
4

わかりました私はそれを解決します。素敵ではありませんが、重要なことはうまくいきます

  Calendar calendar = Calendar.getInstance();
    calendar.setTime(datum);

    DateTime current = new DateTime(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1,
            calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
于 2012-09-12T08:42:56.227 に答える
0

JodaStephenによる回答は正しく、受け入れられるべきです。

Joda-Time チームは、Java 8 以降に組み込まれた java.time フレームワークに移行するように指示しました。そこで、この問題を java.time で試して結果を比較することに興味がありました。

質問は、入力データがCETオフセットからの UTC 用であると述べていますが、質問のコードはその事実を無視しています。以下の私のコードでは、UTC の 1 時間前のオフセットを使用してCET.

java.time

は、 UTCCETの 1 時間前を意味します。UTC からのオフセットのみがあり、フル タイム ゾーンがないため、クラス forを使用します。OffsetDateTime+01:00

LocalDateTime localDateTime = LocalDateTime.of ( 1854 , 1 , 1 , 0 , 0 , 0 , 0 ); // The nineteenth century.
ZoneOffset offset = ZoneOffset.of ( "+01:00" );  // “CET” means one hour ahead of UTC.
OffsetDateTime odt = OffsetDateTime.of ( localDateTime , offset );
Instant instant = odt.toInstant ();  // A moment on the timeline in UTC, with resolution in nanoseconds.
long m = instant.toEpochMilli ();

System.out.println ( "odt: " + odt + " | millis: " + m );

奇数: 1854-01-01T00:00+01:00 | ミリ秒: -3660598800000

Joda-Time

同じコードですが、Joda-Time 2.9.3 を使用しています。

DateTimeZone zone = DateTimeZone.forOffsetHoursMinutes ( 1 , 0 );
DateTime dateTime = new DateTime ( 1854 , 1 , 1 , 0 , 0 , zone );
long millis = dateTime.getMillis ();

System.out.println ( "dateTime: " + dateTime + " | millis: " + millis );

日時: 1854-01-01T00:00:00.000+01:00 | ミリ秒: -3660598800000

結果はjava.timeと同じです。

java.util.Calendar

比較のみ。古い java.util.Date/.Calendar クラスは設計が不十分で、混乱を招き、面倒であることが証明されているため、通常は避けるべきです。

Calendar calendar = Calendar.getInstance ();
calendar.set ( 1854 , 0 , 1 , 0 , 0 , 0 );
TimeZone zone = TimeZone.getTimeZone ( "GMT+01:00" );
calendar.setTimeZone ( zone );
long millis = calendar.getTimeInMillis ();

System.out.println ( "calendar: " + calendar + " | millis: " + millis );

カレンダー: java.util.GregorianCalendar[time=-3660598799715,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+01:00",offset=3600000,dstSavings =0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1854,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR= 1,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=285,ZONE_OFFSET=3600000,DST_OFFSET=0] | ミリ秒: -3660598799715

異なる結果。ここでは、 -3660598799715java.time -3660598800000& Joda-Time と比較して、285.

Europe/Brussels

Europe/Brusselsまた、UTC からのオフセットではなく、タイム ゾーンを使用して 3 つすべてを試しました。

java.time. ZonedDateTimeではなくクラスを使用しOffsetDateTimeます。

LocalDateTime localDateTime = LocalDateTime.of ( 1854 , 1 , 1 , 0 , 0 , 0 , 0 ); // The nineteenth century.
ZoneId zoneId = ZoneId.of ( "Europe/Brussels" );
ZonedDateTime zdt = ZonedDateTime.of ( localDateTime , zoneId );
Instant instant = zdt.toInstant ();  // A moment on the timeline in UTC, with resolution in nanoseconds.
long m = instant.toEpochMilli ();

System.out.println ( "zdt: " + zdt + " | millis: " + m );

zdt: 1854-01-01T00:00+00:17:30[ヨーロッパ/ブリュッセル] | ミリ秒: -3660596250000

Joda-Timeで。一行目だけ違う。

DateTimeZone zone = DateTimeZone.forID ( "Europe/Brussels" ); 

dateTime: 1854-01-01T00:00:00.000+00:17:30 | ミリ秒: -3660596250000

java.util.Calendar で。行を除くいくつかのコードTimeZone:

TimeZone zone = TimeZone.getTimeZone ( "Europe/Brussels" ); 

カレンダー: java.util.GregorianCalendar[time=-3660598799151,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="ヨーロッパ/ブリュッセル",offset=3600000,dstSavings=3600000 ,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=ヨーロッパ/ブリュッセル,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=- 1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA =1,YEAR=1854,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0 ,SECOND=0,MILLISECOND=849,ZONE_OFFSET=3600000,DST_OFFSET=0] | ミリ秒: -3660598799151

を使用している 3 つすべてEurope/Brusselsが、オフセットが のバージョンと異なります+01:00

また、java.time と Joda-Time は一致してい-3660596250000ますがCalendar( -3660598799151)、違いはありますが ( )、 2,549,151(約 42 分半) の違いがあります。

于 2016-05-21T23:15:50.077 に答える
0

使用できる java.util.date のタイプとして日付がある場合

java.util.Date date = ....
DateTime dateTime = new DateTime(date.getTime());
于 2012-09-12T07:43:51.497 に答える
0

このコード

Calendar cal1 = Calendar.getInstance();
    cal1.set(1854, 0, 1, 0, 0, 0);
    DateTime start = new DateTime(cal1.getTime());
    System.out.println(start);
    System.out.println(cal1.getTime());

出力:

1854-01-01T00:00:00.941Z
Sun Jan 01 00:00:00 GMT 1854

ミリ秒の不一致は、ミリ秒のカウントを開始するために、現在のように現在の時刻をカレンダーで選択することだと思います。一方、joda-time は真夜中を選択します。または、同様に鈍いもの。私は Java に組み込まれている Calendar と Date に近づかないようにしています。これらは忌まわしいものです。

于 2012-09-12T08:13:06.530 に答える