2015-06-16 11 views
7

Wie die Zeit auf Zeitzone in Local Basis ändern, hier i ein Datum mit Zeitzone als EST aufgebaut hat, jetzt brauche ich die UTC der finden entsprechende Zeit. Bitte helfen Sie mir, wie Sie dies SieConvert Zeit basierend auf Zeitzone mit java.time

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

Der Ausdruck 'formatter.withZone (ZoneId.of ("EST5EDT")); 'ist nutzlos, da Sie es keiner Instanz von' DateTimeFormatter' zuweisen. Denken Sie daran, dass diese Klasse unveränderlich ist, so dass alle Änderungen nur durch Kopieren, nicht durch Manipulieren derselben Instanz erreicht werden können. Und das Einstellen der Zeitzone auf diese Weise hat keinen Einfluss auf das Parsing auf 'LocalDateTime' (Zone wird ignoriert). –

Antwort

7

Diese Antwort könnte irgendwie strukturierter sein als die richtige Antwort von Jon Skeet. In meinem obigen Kommentar habe ich auch darauf hingewiesen, die unveränderliche Natur von nicht zu übersehen, also weisen Sie immer das Ergebnis einer beliebigen Methode mit dem Präfix "with ...()" einer Variablen desselben Typs zu.

// 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 

Dann weisen Sie der EST-Zone Ihre lokale Datums-/Uhrzeit zu. Es ist sicherer, die IANA-Notation "America/New_York" zu verwenden, als die veraltete Form "EST5EDT" zu verwenden (die nur feste dst-Regeln unterstützt, ohne historische Historie von Offsets).

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

Schließlich verwandeln Sie die Zwischen globalen Zeitstempel zurück zu einem lokalen Datum-Zeit im Offset UTC + 00 die gleiche physikalische Zeit zu bewahren:

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

lösen sollten ein LocalDateTime nicht darüber nachdenken „um die Zeitzone zu ändern“ - ein LocalDateTime nicht haben eine Zeitzone. Stattdessen sollten Sie eine ZonedDateTime aus einer LocalDateTime und einer Zeitzone (ZoneId) erstellen. Entfernen Sie zuerst die formatter.withZone Anruf, dann verwenden:

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

Dann Sie, dass zu einem Zeitpunkt umwandeln könnte, oder vielleicht verwenden:

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

So zum Beispiel:

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)); 
    } 
} 
Verwandte Themen