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
fonte
2015-06-16 16:39:39
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). –