2015-06-16 10 views
7

Come modificare l'ora del fuso orario in LocalDateTime, qui ho costruito un appuntamento con fuso orario come EST, ora ho bisogno di trovare il UTC del tempo corrispondente. please help me come risolvere questotempo Converti sulla base di fuso orario utilizzando java.time

String str = "16Jun2015_153556"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMMyyyy_HHmmss"); 
formatter.withZone(ZoneId.of("EST5EDT")); 
LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 
+0

L'espressione 'formatter.withZone (ZoneId.of ("EST5EDT")); 'è inutile perché non lo si assegna a nessuna istanza di' DateTimeFormatter'. Ricorda che questa classe è immutabile, quindi tutte le modifiche possono essere ottenute solo copiando, non manipolando la stessa istanza. E l'impostazione del fuso orario in questo modo non influisce sull'analisi di 'LocalDateTime' (la zona verrà ignorata). –

risposta

7

Questa risposta potrebbe essere in qualche modo più strutturato della risposta corretta di Jon Skeet. Nel mio commento sopra ho anche sottolineato di non trascurare la natura immutabile di DateTimeFormatter quindi per favore assegna sempre il risultato di qualsiasi metodo preceduto da "con ...()" ad una variabile dello stesso tipo.

// parsing your string input 
// NO!!! timezone is needed in this step because LocalDateTime is just without timezone 
String str = "16Jun2015_153556"; 
DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("ddMMMuuuu_HHmmss", Locale.ENGLISH); 
LocalDateTime ldt = LocalDateTime.parse(str, formatter); 

System.out.println(ldt); // your input as java.time-object: 2015-06-16T15:35:56 

Quindi si assegna l'ora locale alla zona EST. È più sicuro usare la notazione IANA "America/New_York" piuttosto che utilizzare il modulo obsoleto "EST5EDT" (che supporta solo regole dst fisse senza cronologia di offset cronologici grezzi).

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/New_York")); 

Infine si trasformano il timestamp globale intermedio di nuovo ad un data-ora locale presso l'UTC offset di + 00 mantenendo lo stesso tempo fisico:

LocalDateTime utc = zdt.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime(); 
System.out.println(utc); // 2015-06-16T19:35:56 
12

Non si dovrebbe pensare a "cambiare il fuso orario" di un LocalDateTime - un LocalDateTime non fa ha un fuso orario. Invece, è necessario creare un ZonedDateTime da un LocalDateTime e un fuso orario (ZoneId). In primo luogo rimuovere la chiamata formatter.withZone, quindi utilizzare:

ZonedId zone = ZoneId.of("EST5EDT"); // Or preferrably "America/New_York" 
ZonedDateTime zoned = ZonedDateTime.of(dateTime, zone); 

allora si potrebbe convertire in un istante, o forse usare:

ZonedDateTime utc = zoned.withZoneSameInstant(ZoneOffset.UTC); 

Così, per esempio:

import java.time.*; 
import java.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String str = "16Jun2015_153556"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMMyyyy_HHmmss"); 
     ZoneId zone = ZoneId.of("America/New_York"); 
     LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 
     ZonedDateTime zoned = ZonedDateTime.of(dateTime, zone); 

     // Both of these print 2015-06-16T19:35:56Z 
     System.out.println(zoned.toInstant()); 
     System.out.println(zoned.withZoneSameInstant(ZoneOffset.UTC)); 
    } 
} 
Problemi correlati