Stavo scrivendo alcune testcode per java-8 conversione tra java.util.Date e java.time.LocalDateTime, e ha scoperto un'anomalia sembra verificarsi nel ora dopo la transizione da normaltime-to-estate , quando l'anno è 2038 o superiore.Bug in jdk8 date-conversion?
Volevo solo sapere se questo è un bug in jdk8, o se sto facendo qualcosa di sbagliato?
Nota: Sono su Windows-7, 64 bit JDK, quindi non dovrebbe essere influenzata dal bug 2038-unix, che avrebbe un effetto molto peggio.
Qui il mio demo-code:
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);
}
}
}
uscita:
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'
Come si può vedere dall'output, LocalDateTime (2038/03/28 : 22: 22) viene convertito in java.util.Date (2038-03-28 : 22: 22), ecc. Ma non quando l'anno è inferiore a 2038.
Qualcuno ha qualche input per questo?
EDIT:
mio ZoneId.systemDefault() dà: "Europe/Berlin"
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
Suggerimento: hai google 'java.util.date 2038'. Ciò si traduce, ad esempio, http://stackoverflow.com/questions/15014589/java-util-date-bug e per il divertimento di leggere anche http://stackoverflow.com/questions/4313707/why-should-a-java-programmer -care-about-year-2038-bug – Dilettant
Java è basato sul tempo Unix, e l'anno 2038 è la versione Unix di Windows y2k bug – yonisha
Grazie per i collegamenti, ma leggendoli attentamente, questo sembra diverso. Java non è ** supposto che abbia il 2038-bug su un sistema Windows a 64 bit, che sto usando. Ho dimenticato di dirlo, mi dispiace. – Rop