2014-04-09 11 views
5
// someTime is epoch in millis (UTC) 

final long timeNow = new Date().getTime(); 
final long midnight = timeNow - timeNow % (3600 * 24 * 1000L); 
final long yesterdayMidnight = midnight - (3600 * 24 * 1000L); 


// check if same day. 
if (someTime >= midnight) 
    // do something 

// check if yesterday 
if (someTime >= yesterdayMidnight) 

Modificato: Il mio scopo è controllare se un giorno è nello stesso giorno o nel giorno precedente senza fare troppe cose pesanti.Questo account per l'ora legale?

Questo conto per risparmiare giorno luce e perché? In caso contrario, qual è la logica più semplice?

+0

Se si dice nuova data(); , significa che ti stai riferendo alla data corrente del tuo sistema. Qualunque sia la data del tuo sistema impostata, otterrai solo quel tempo. – Stunner

+1

@ MarounMaroun Credo che la domanda sia, in effetti, "è sicuro usare questo codice avendo in mente un possibile interruttore per l'ora legale". –

+0

@IvayloStrandjev grazie per i chiarimenti. Ho cambiato il titolo – Lucas

risposta

4

Il codice corrente non funziona nulla con il fuso orario locale - tutto è in UTC, in modo efficace (sicuramente in termini di codice, che si occupa di "millisecondi dall'epoca di Unix").

Se si desidera rendere il vostro codice di fuso orario sensibile, si dovrebbe usare (in ordine di preferenza):

Utilizzare astrazioni di livello superiore, se possibile - il codice dovrebbe fare come minima manipolazione del tempo a basso livello.

EDIT: Ora che sappiamo lo scopo, ecco un esempio di implementazione in Joda Time:

public void calculate(Instant now, Instant then, DateTimeZone zone) { 
    LocalDate today = new LocalDate(now, zone); 
    LocalDate otherDay = new LocalDate(then, zone); 
    if (otherDay.equals(today)) { 
     // Today day 
    } else if (otherDay.equals(today.minusDays(1)) { 
     // Yesterday 
    } else { 
     // Neither today nor yesterday 
    } 
} 

Si noti come non c'è nulla di basso livello qui - stiamo solo lavorando data in cui ogni valore (di tanto in tanto) rientra nel fuso orario indicato e quindi li confronta.

+0

+1 per 'java.time' – ifloop

0

In alcuni casi l'assegno non verrà eseguito avendo in mente l'ora legale. Supponiamo che ora siano le 5:00 del giorno in cui si verifica l'ora legale e alle 3 in punto abbiamo spostato l'orologio in avanti. Quindi sono passate solo 4 ore da mezzanotte, ma è in realtà 5. Quindi midnight nel tuo codice sarà un'ora 5 ore fa. Ciò significa che se someTime è tra 5 ore fa e 4 ore fa (ad esempio 4 ore e mezzo fa), quando in realtà è stato ieri, il tuo algoritmo segnalerà che è stato oggi.

+0

ha appena visto il tuo commento oggi. la 5a ora in ora locale è mappata alla quarta ora in UTC, quindi 'mezzanotte 'è 4 ore fa alle 5 in punto (locale). Infatti, poiché tutto è in UTC che non ha l'ora legale, penso che il mio algo sia corretto. UTC è come una freccia che vola in un percorso lineare (senza considerare gli effetti relativistici) – Lucas

0

Non sembra corretto dall'ora legale. Innanzitutto, qual è il fuso orario di una data? Per quanto riguarda i giorni/le notti (di fatto) quando si effettua l'ora legale (un'ora +/-)? Se si utilizza Joda lib, esiste un metodo conveniente DateTime.isBefore() che restituirà se una data è prima di un'altra.

Problemi correlati