2015-10-13 15 views
11

Sto esplorando la nuova API java.time di Java 8. Sto cercando in particolare di recuperare l'ora corrente (il mio fuso orario corrente, di un fuso orario diverso e di un offset diverso).Ottenere l'ora corrente in Java 8

Il codice è:

public static void getCurrentLocalTime(){ 
    LocalTime time = LocalTime.now(); 
    System.out.println("Local Time Zone: "+ZoneId.systemDefault().toString()); 
    System.out.println("Current local time : " + time); 
} 

public static void getCurrentTimeWithTimeZone(){ 
    LocalDateTime localtDateAndTime = LocalDateTime.now(); 
    ZoneId zoneId = ZoneId.of("America/Los_Angeles"); 
    ZonedDateTime dateAndTimeInLA = ZonedDateTime.of(localtDateAndTime, zoneId); 
    String currentTimewithTimeZone =dateAndTimeInLA.getHour()+":"+dateAndTimeInLA.getMinute(); 
    System.out.println("Current time in Los Angeles: " + currentTimewithTimeZone); 
} 

public static void getCurrentTimeWithZoneOffset(){ 
    LocalTime localtTime = LocalTime.now(); 
    ZoneOffset offset = ZoneOffset.of("-08:00"); 
    OffsetTime offsetTime = OffsetTime.of(localtTime, offset); 
    String currentTimewithZoneOffset =offsetTime.getHour()+":"+offsetTime.getMinute(); 
    System.out.println("Current time with offset -08:00: " + currentTimewithZoneOffset); 
} 

Ma, quando chiamo i metodi ottengo lo stesso (il mio tempo di sistema) ora del giorno, che non è ovviamente quello che mi aspetto.

L'uscita del metodo chiamate:

Current time in Los Angeles: 19:59 
Local Time Zone: Asia/Calcutta 
Current local time : 19:59:20.477 
Current time with offset -08:00: 19:59 

Anche dopo aver impostato un diverso fuso orario e l'offset, perché mi appare allo stesso tempo?

+0

sembra molto vicino alla http://stackoverflow.com/questions/5175728/how-to-get-the-current -date-time-in-java – mkobit

+0

Per "(locale" intendevi "il mio fuso orario attuale"? È così, modifica da correggere. "Locale" ha un significato specifico diverso nel lavoro data-ora. "tempo" intendevi "ora del giorno", diciamo così, come "tempo" è ambiguo, oppure dici "data-ora" se intendevi la data più l'ora del giorno. –

+0

Modificato. Grazie per avermelo segnalato. – user2693135

risposta

14

LocalDateTime.now() restituisce sempre la data/ora corrente nel fuso orario predefinito (ad esempio il 13 ottobre alle 11.20 di Londra). Quando si crea un ZonedDateTime o OffsetTime da esso con uno specifico ZoneId o ZoneOffset, si ottiene la stessa data e ora ma in un fuso orario diverso (ad esempio 13 ottobre alle 11.20 a Los Angeles), che rappresenta un diverso istante di tempo.

Probabilmente si sta cercando qualcosa di simile:

Instant now = Instant.now(); 
ZoneId zoneId = ZoneId.of("America/Los_Angeles"); 
ZonedDateTime dateAndTimeInLA = ZonedDateTime.ofInstant(now, zoneId); 

Questo calcolerà la data e l'ora corrente a Los Angeles: 13 ottobre, 03:20.

5

Considerate i seguenti metodi fisse:

public static void getCurrentLocalTime() { 
    LocalTime time = LocalTime.now(); 
    System.out.println("Local Time Zone: " + ZoneId.systemDefault().toString()); 
    System.out.println("Current local time : " + time); 
} 

public static void getCurrentTimeWithTimeZone() { 
    LocalDateTime localDateAndTime = LocalDateTime.now(ZoneId.of("America/Los_Angeles")); 
    System.out.println("Current time in Los Angeles: " + localDateAndTime.toLocalTime()); 
} 

public static void getCurrentTimeWithZoneOffset() { 
    LocalTime localTime = LocalTime.now(ZoneOffset.of("-08:00")); 
    System.out.println("Current time with offset -08:00: " + localTime); 
} 

Che cosa è cambiato è che invece di chiamare now(), viene effettuata la chiamata a now(zone). Questo perché now() restituisce sempre l'ora di sistema corrente nel proprio fuso orario. Le chiamate a atZone, OffsetTime.of o ZoneDateTime.of non modificano la data/l'ora, ma indicano solo a Java Time che la data deve essere compresa in una data/ora in questo fuso orario.

Quando si chiamano questi 3 metodi, ecco l'output sulla mia macchina:

Local Time Zone: Europe/Paris 
Current local time : 12:32:21.560 
Current time in Los Angeles: 03:32:21.579 
Current time with offset -08:00: 02:32:21.580 

per rendere questo molto chiaro: sei in Europa e chiamare LocalDateTime.now().atZone(ZoneId.of("America/Los_Angeles")) - si sta creando un gruppo data/ora, che rappresenta la corrente -time in Europa come se fossi a Los Angeles, quindi stai creando una data/ora che è in realtà nel futuro per i residenti di Los Angeles (8 o 9 ore in futuro, a seconda dell'ora legale).

3

C'è anche un altro modo di visualizzare il tempo in un'altra zona utilizzando withZoneSameInstant:

// now, in current zone, 
// 2016-04-13T14:24:57.618+02:00[Europe/Warsaw] 
ZonedDateTime now = ZonedDateTime.now(); 

// 2016-04-13T05:24:57.618-07:00[America/Los_Angeles] 
ZonedDateTime losAngelesDateTime = now.withZoneSameInstant(ZoneId.of("America/Los_Angeles"));