Miałem sytuacji, w której środowisko wykonawcze Java zwróciło rodzaj "odwróconych" milisekund wartości podczas odczytu dat z bazy danych (w java.sql.Date
). Wartość milisekundy wynosiła w przybliżeniu tyle samo dni, ale została odliczona wstecz od roku 0.Jak działa java.sql.Date z ujemnymi datami?
Problem został rozwiązany przez ponowne uruchomienie środowiska wykonawczego Java.
Ale: dowiedziałem się, że Java obsługuje te "odwrócone" wartości prawie poprawnie z wyjątkiem dnia tygodnia.
Po uruchomieniu poniższy kod:
System.out.println(new java.util.Date(253402214400000l));
System.out.println(new java.util.Date(-377648784000000l));
otrzymasz następujący wynik:
Fri Dec 31 01:00:00 CET 9999
Tue Dec 31 01:00:00 CET 9999
Inny przykład:
System.out.println(new java.util.Date(-294192000000l));
System.out.println(new java.util.Date(-123967324800000l));
Wynik:
Mon Sep 05 01:00:00 CET 1960
Mon Sep 05 01:00:00 CET 1960
Podczas korzystania z konwerterów online wynik będzie różny dla danej drugiej linii. spowoduje to negatywnego daty (rok jest ujemny) blisko realnej, pozytywnej dniu:
Example1:
253402214400000 = Fri Dec 31 9999 01:00:00
-377648784000000 = Tue Oct 15 -9998 02:00:00
Example 2:
-294192000000 = Mon Sep 05 1960 02:00:00
-123967324800000 = Mon Aug 19 -1959 02:00:00
nie znalazłem żadnych informacji o tym „temacie”.
A więc, jaki jest mit za "odwróconymi" datami? Dlaczego Java obsługuje je prawie poprawnie? I jakie jest znaczenie JDBC ResultSet
zwracając "odwrócone" wartości milisekund podczas wywoływania resultSet.getDate(1).getTime()
?
Czy mówisz o 'java.util.Date' lub' java.sql.Date'? Zdaj sobie sprawę, że zachowanie zestawu wyników JDBC zależy od sterownika, ponieważ każdy sterownik implementuje go dla swojej bazy danych. –
To java.sql.Date (podklasa java.util.Date) – praisezh
Nie mam pojęcia, co masz na myśli przez "odwrócony". – chrylis