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!

È stato utile?

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 java.time framework è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi data-ora come java.util.Date, .Calendar e java.text.SimpleDateFormat.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top