私は異常をjavaの-8変換間java.util.Dateとjava.time.LocalDateTimeのためのいくつかのtestcodeを書いて、発見されたが normaltimeツー夏からの移行後時間に発生するようです年が2038年かそれ以上のとき。jdk8の日付変換のバグ?
これはjdk8のバグか、私が間違っているかどうかを知りたかっただけですか?
注:私は、Windows-7、64ビットJDKの午前、そんなに悪いことな効果を持っているでしょう2038-UNIXのバグによって影響を受けるべきではありません。ここで
私のデモ・コード:
package conversiontest;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
public class ConversionTest {
public static void main(String[] args) {
new ConversionTest().testDateConversion();
}
// Method under test:
public java.util.Date toJavaUtilDate(LocalDateTime localDateTime) {
return java.util.Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
// Test-code:
public void testDateConversion() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
LocalDate localDate = LocalDate.of(2016, 1, 1);
LocalTime localTime = LocalTime.of(3, 22, 22); // 03:22:22
while (!localDate.toString().startsWith("2045-")) {
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
java.util.Date date = toJavaUtilDate(localDateTime);
String sLocalDateTime = localDateTime.toString().replace("T", " ");
String sJavaUtilDate = sdf.format(date);
if (!sLocalDateTime.equals(sJavaUtilDate)) {
System.out.println(String.format("FAILURE: '%s' != '%s'", sLocalDateTime, sJavaUtilDate));
}
localDate = localDate.plusDays(1);
}
}
}
出力:
FAILURE: '2038-03-28 03:22:22' != '2038-03-28 02:22:22'
FAILURE: '2039-03-27 03:22:22' != '2039-03-27 02:22:22'
FAILURE: '2040-03-25 03:22:22' != '2040-03-25 02:22:22'
FAILURE: '2041-03-31 03:22:22' != '2041-03-31 02:22:22'
FAILURE: '2042-03-30 03:22:22' != '2042-03-30 02:22:22'
FAILURE: '2043-03-29 03:22:22' != '2043-03-29 02:22:22'
FAILURE: '2044-03-27 03:22:22' != '2044-03-27 02:22:22'
あなたは出力、のLocalDateTimeから見ることができるように(2038年3月28日:22:22) は、java.util.Date(2038-03-28 :22:22)などに変換されます。ただし、では、は2038未満です。
誰でもこの情報を入力していますか?
EDIT:
私ZoneId.systemDefaultは()を与える: "ヨーロッパ/ベルリン"
C:\>java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
C:\>javac -version
javac 1.8.0_91
ヒント:あなたはgoogle 'java.util.date 2038'ですか?これにより、例えばhttp://stackoverflow.com/questions/15014589/java-util-date-bugが得られ、また読書の楽しさも得られます。http://stackoverflow.com/questions/4313707/why-should-a-java-programmer -care-about-year-2038-bug – Dilettant
JavaはUnix時間に基づいており、2038年はUnix版のWindows y2kバグです – yonisha
リンクをありがとうございますが、注意深く読んでください。 Javaは**私が使用している64ビットWindowsシステムで2038-bugを持つはずです**。そのことを忘れた、申し訳ありません。 – Rop