我在寫一些testcode爲java.time.LocalDateTime的java-8的轉換java.util.Date和之間,發現異常似乎從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時。
任何人都有一些輸入呢?
編輯:
我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
提示:您是否在谷歌'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 bug – yonisha
感謝您的鏈接,但仔細閱讀它們,這看起來不同。 Java是**不**應該有一個64位的Windows系統,我正在使用2038錯誤。忘了提到那個,對不起。 – Rop