java HOUR e HOUR_OF_DAY restituiscono entrambi 12 ore
-
27-10-2019 - |
Domanda
Sto usando il seguente codice per provare a ottenere HOUR_OF_DAY (0-23) di un timestamp unix, convertito in millisecondi.Il timestamp "1296442971" viene convertito in Sun Jan 30 2011 22:02:51 GMT-0500 (EST).
Sto eseguendo il codice seguente per provare a ottenere il timestamp di 24 ore:
//calculate the hour for this timestamp
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone(tz));
calendar.setTimeInMillis(ts * 1000);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int twelveHour = calendar.get(Calendar.HOUR);
In questo esempio, sia "ora" che "dodici ore" hanno il valore 10, mentre "ora" dovrebbe avere il valore "22".Qualcuno ha qualche idea su cosa potrebbe esserci di sbagliato nel mio codice?
Grazie!
Soluzione
Supponendo che ts sia la variabile contenente il valore 1296442971 .Credo che tu abbia non dichiarato che è di tipo lungo e quindi potrebbe essere traboccante
Di seguito funziona dopo aver cambiato ts in tipo lungo
long l = 1296442971;
calendar.setTimeInMillis(l * 1000);
out.println(calendar.getTime());
out.println(calendar.get(Calendar.HOUR_OF_DAY));
out.println(calendar.get(Calendar.HOUR));
Altri suggerimenti
Questo stampa rispettivamente 22 e 10 per me.Sembra corretto per New York (dato che hai menzionato l'ora orientale).
long ts = 1296442971;
Calendar calendar = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("America/New_York");
calendar.setTimeZone(tz);
calendar.setTimeInMillis(ts*1000);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int twelveHour = calendar.get(Calendar.HOUR);
System.out.println("hour:"+hour);
System.out.println("twelvehour:"+twelveHour);
Il tuo problema è quasi certamente che stai utilizzando un int
per contenere i secondi.Digita il seguente programma che controlla int
e long
:
import java.util.Calendar;
import java.util.TimeZone;
public class scratch {
public static void main (String args[]) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("America/New_York"));
int intval = 1296442971;
calendar.setTimeInMillis(intval * 1000);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int twelveHour = calendar.get(Calendar.HOUR);
System.out.println (hour);
System.out.println (twelveHour);
long longval = 1296442971L;
calendar.setTimeInMillis(longval * 1000);
hour = calendar.get(Calendar.HOUR_OF_DAY);
twelveHour = calendar.get(Calendar.HOUR);
System.out.println (hour);
System.out.println (twelveHour);
}
}
e ottieni:
10
10
22
10
tl; dr
Instant.ofEpochSecond( 1_296_442_971L )
.atZone( ZoneId.of( "America/New_York" ) )
.getHour()
23
... per il valore: 2011-01-30T23:02:51-04:00[America/New_York]
Intero a 32 bit e 64 bit
Come indicato correttamente nelle altre risposte, è necessario utilizzare un long
o Long
a 64 bit per tenere traccia del numero di millisecondi dal 1970 in UTC. Il tuo numero 1296442971
è il numero di secondi interi dal 1970 in UTC. Quando viene moltiplicato per 1.000 per ottenere millisecondi dall'epoca, si supera il limite di un int
o Integer
a 32 bit.
java.time
Un altro problema è che stai usando vecchie e fastidiose classi data-ora legacy, ora sostituite da java.time classi.
Instant
La classe Instant
rappresenta un momento sulla sequenza temporale in UTC con una risoluzione di nanosecondi .
La classe Instant
ha un metodo factory per importare un numero di secondi interi dall'epoca.
Instant instant = Instant.ofEpochSecond( 1_296_442_971L );
instant.toString (): 2011-01-31T03: 02: 51Z
ZonedDateTime
Per vedere l'ora dell'orologio da parete della costa orientale degli Stati Uniti, applica un ZoneId
per un fuso orario come America/New_York
per ottenere un oggetto ZonedDateTime
.
ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2011-01-30T23: 02: 51-04: 00 [America / New_York]
Interrogare l'ora del giorno nella numerazione 24 ore da 0 a 23 chiamando getHour
.
int hourOfDay = zdt.getHour();
23
Informazioni su java.time
Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione a java.time.
Per ulteriori informazioni, vedere il Oracle Tutorial . E cerca in Stack Overflow molti esempi e spiegazioni.
Gran parte della funzionalità java.time viene trasferita su Java 6 e 7 in ThreeTen-Backport e ulteriormente adattato a Android in ThreeTenABP (vedi Come usare ... ).
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Potresti trovare alcune classi utili qui come Interval
, YearWeek
, YearQuarter
e altro.