2013-10-10 11 views
8


L'ora e la data restituita sono corretti tranne per l'ora, che è di 1 ora inferiore a quello che dovrebbe essere.

mi sembra essere l'impostazione tutto ciò che è necessario per ottenere l'ora e la data corrette:Perché il calendario restituisce l'ora sbagliata con il fuso orario corretto?

- I'm using Calendar.getInstance(), instead of new Date() 
- I'm setting the timezone of the Calendar instance with Timezone.getTimeZone 
- I'm using DateFormat and SimpleDateFormat to format the output 


mio fuso orario è Eastern Standard Time, aka UTC/GMT-5:00. Nessuna di queste linee stanno avendo alcun effetto:

- cal.setTimeZone(TimeZone.getTimeZone(cal.getTimeZone().getDisplayName())); 
- cal.setTimeZone(TimeZone.getTimeZone("EST")); 
- cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
- cal.setTimeZone(TimeZone.getTimeZone("GMT")); 
- cal.setTimeZone(TimeZone.getTimeZone("GMT-5:00")); 

... ma ognuna di queste opzioni imposta il fuso orario desiderato.


Ecco il mio tentativo, dove sono erroneamente aggiungendo 1 ora per l'istanza Calendar:

PrintWriter output = null; 

try { 
    output = new PrintWriter(
    new BufferedWriter(new FileWriter("output.txt", true))); 

    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:ms MM/dd/yyyy"); 
    Calendar cal = Calendar.getInstance(); 

    // ...doesn't seem to be working: 
    cal.setTimeZone(TimeZone.getTimeZone(cal.getTimeZone().getDisplayName())); 

    /* 
    * adding an extra hour here, to make up for the incorrect hour value??? 
    * ...without this line, everything is correct except the hour = n - 1: 
    */ 
    //cal.setTimeInMillis(cal.getTimeInMillis() + (1000 * 60 * 60)); 

    // printing to console here: 
    System.out.println(dateFormat.format(cal.getTime())); 
    System.out.println(cal.getTimeZone().getDisplayName()); 

    // printing to the log-file here: 
    output.println(dateFormat.format(cal.getTime())); 
    output.println(cal.getTimeZone().getDisplayName()); 

} catch (IOException e) { 
    e.printStackTrace(); 

} finally { 
    if (output != null) { 
    output.close(); 
    } 
} 


uscita:

10:05:43:543 10/10/2013 
GMT-05:00 

SBAGLIATO - Si suppone che sia 11:05:43:543! (P.S. - io purtroppo non è possibile utilizzare Joda-Time)

+0

Ora legale? – John

+0

@John - Non so, bella domanda ... il periodo di risparmio di luce di quest'anno sembra apparentemente domenica 10 marzo e termina domenica 3 novembre. "Calendar" e/o "Fuso orario" * potrebbero non tener conto di ciò? –

+2

C'è una risposta nel link: http://stackoverflow.com/questions/10545960/how-to-tackle-daylight-savings-using-timezone-in-java spero che sia utile. – guanda

risposta

3

1) Impostare il fuso orario in SimpleDateFormat

2) Utilizzare UTC o un fuso orario "reale" come ("Austria/Vienna");
(Il nome del paese e la città più grande di TimeZone lo cercheranno)
EST (= UTC-5) non è un fuso orario molto adatto allo scopo computazionale, perché è l'ora senza l'ora legale.

Un altro esempio dell'Europa centrale:
In inverno usiamo MEZ (CET), in estate (risparmio di luce diurna) che usiamo (MESZ = CEST).
Ma tu vuoi che il tuo computer caluclates quello per te, quindi non usare quello:

I fusi orari sono geo poilitici, quindi il nome del paese è necessario. (Es. Russia qualche tempo fa, e la Spagna sta discutendo ora)
Ogni paese può decidere di cambiare il suo fuso orario quando vogliono

+0

Grazie @AlexWien, '" America/New_York "' funziona nel mio caso. Mi chiedo, perché un fuso orario come "EST" è un parametro accettabile se non tiene conto dell'ora legale? –

+1

Probabilmente perché è un fuso orario, sfortunatamente nessuno che è valud durante tutto l'anno. Esistono anche paesi che non utilizzano l'ora legale – AlexWien

1

calendario non tiene conto di risparmio di luce del giorno.

Secondo questo post: How to tackle daylight savings using Timezone in java

Le abbreviazioni 3 lettere dovrebbero essere evitati con tutto il cuore a favore delle zone TZDB ID. EST è l'ora solare orientale e l'ora solare non osserva mai l'ora legale; in realtà non è un nome per il fuso orario completo. È il nome usato per parte di un fuso orario. (Purtroppo non ho incontrato un buon termine per questo concetto "la metà fuso orario".)

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));

Questo è un buon punto di partenza: http://download.java.net/jdk8/docs/api/java/time/ZoneId.html

+0

Questo è un commento possibile o meglio migliorare la tua risposta! –

0


Ai posteri, ecco il mio migliore codice in base al post "How to tackle daylight savings using Timezone in java":

PrintWriter output = null; 

try { 
    output = new PrintWriter(
     new BufferedWriter(new FileWriter("output.txt", true))); 

    // here are the relevant changes (a lot less code!): 
    TimeZone zone = TimeZone.getTimeZone("America/New_York"); 
    SimpleDateFormat simpleFormat = new SimpleDateFormat("HH:mm:ss:ms MM/dd/yyyy"); 
    simpleFormat.setTimeZone(zone); 

    // printing to console here: 
    System.out.println(simpleFormat.format(new Date())); 
    System.out.println(simpleFormat.getTimeZone().getDisplayName()); 

    // printing to the log-file here: 
    output.println(simpleFormat.format(new Date())); 
    output.println(simpleFormat.getTimeZone().getDisplayName()); 

} catch (IOException e) { 
    e.printStackTrace(); 

} finally { 
    if (output != null) { 
    output.close(); 
    } 
} 


Si noti che sto usando SimpleDateFormatinvece di DateFormat, da personalizzare il formato di output (non è necessario utilizzare entrambi).

+1

Nel caso in cui qualcuno incontri questo problema, il formato utilizzato qui per data e ora (HH: mm: ss: ms MM/gg/aaaa) non è sempre valido. Dipende da come e dove lo stai conservando. Memorizzazione in un database MySQL come datetime che è necessario utilizzare (aaaa-MM-gg HH: mm: ss) per esempio. L'esempio qui è solo il log in un file o console, quindi il formato utilizzato è ok. – Blizzardengle

Problemi correlati