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
異なる結果。ここでは、 -3660598799715
java.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 分半) の違いがあります。