Avevo una situazione in cui il runtime Java restituiva valori di millisecondo "invertiti" durante la lettura delle date dal database (in java.sql.Date
). Il valore del millisecondo era approssimativamente lo stesso numero di giorni, ma contava all'indietro a partire dall'anno 0.Come funziona java.sql.Date con date negative?
Il problema è stato risolto semplicemente riavviando il runtime Java.
Ma: ho scoperto che Java gestisce questi valori "invertiti" quasi correttamente tranne il giorno della settimana.
Quando si esegue il seguente codice:
System.out.println(new java.util.Date(253402214400000l));
System.out.println(new java.util.Date(-377648784000000l));
Si otterrà il seguente output:
Fri Dec 31 01:00:00 CET 9999
Tue Dec 31 01:00:00 CET 9999
Un altro esempio:
System.out.println(new java.util.Date(-294192000000l));
System.out.println(new java.util.Date(-123967324800000l));
Risultato:
Mon Sep 05 01:00:00 CET 1960
Mon Sep 05 01:00:00 CET 1960
Quando si utilizzano convertitori online, il risultato sarà diverso per la seconda riga in particolare. Il risultato sarà una data negativo (l'anno è negativo) vicino al reale, data di positivo:
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
non ho trovato alcuna informazione su questo "argomento".
Quindi, qual è il mito dietro date "invertite"? Perché Java li gestisce quasi correttamente? E qual è il senso di un JDBC ResultSet
che restituisce valori "invertiti" al millisecondo quando chiama resultSet.getDate(1).getTime()
?
Stai parlando di 'java.util.Date' o' java.sql.Date'? Renditi conto che il comportamento di un set di risultati JDBC è specifico del driver, dato che ciascun driver lo implementa per il proprio database specifico. –
È un java.sql.Date (sottoclasse di java.util.Date) – praisezh
Non ho idea di cosa intendi per "invertito". – chrylis