2017-12-26 31 views
0

Ich versuche zu konvertieren Datum zu folgenden Zeitzone aber Ergebnis als nicht zu erwarten Converting Datum - Die Anforderung, ich habe zu sagen zum Beispiel Umwandlung von PMST zu EST sollte der Ausgang 2 Stunde Weniger.zu EST in Java 8

PMST, NST, AST, EST, CST, MST, PST, AKST, HAST

String inputDate = "2017/04/30 08:10"; 
DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); 
LocalDateTime local = LocalDateTime.parse(inputDate, sourceFormatter); 
ZonedDateTime zoned = local.atZone(TimeZone.getTimeZone("PMST").toZoneId()); 
ZonedDateTime requiredZone = zoned.withZoneSameInstant(TimeZone.getTimeZone("EST").toZoneId()); 
System.out.println(requiredZone); 

Output- 2017-04-30T03: 10- 05:00

+1

Wie von Sarvesh erwähnt, gibt es keine Zeitzone PMST in ZoneId erwähnt, so dass Sie es explizit erwähnen müssen. Sie können die unterstützten Zonen-IDs in ZoneId.java überprüfen – Shriram

+0

Identifizieren oder korrigieren Sie Ihre 'PMST'. –

Antwort

2

So wissen Sie, dass Ihre Eingabe "lokales Datum" ist in der PMST-Zeitzone.

Aber Sie sollten in der Lage sein zu beachten, dass das oben genannte nicht die Zeitzone Informationen enthält, die Sie kennen. Sie müssen diese Informationen also zum String hinzufügen.

Aber was wir jetzt haben, ist nur ein String, so erste haben wir zum Zeitpunkt der Zeitformat entscheiden, die wir verwenden werden, und es hat Time-Zone bewusst,

DateTimeFormatter dateTimeWithZoneFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm Z"); 

Hier zu sein, stellt Z die Zeitzonen-Offset. Wir wissen, dass PMST ist UTC-0300, also müssen wir diese Informationen, um unsere lokale Zeit Zeichenfolge hinzuzufügen,

String dateTimeString = "2017/04/30 08:10" + " -0300"; 

Nun können wir es unser Datum Zeitformatierer lesen verwenden,

ZonedDateTime dateTimeInPMST = ZonedDateTime.parse(dateTimeString, dateTimeWithZoneFormatter); 

Und wir jetzt kann erhalten das Datum in jeder Zeitzone wir wollen,

ZonedDateTime dateTimeInEST = dateTimeInPMST.withZoneSameInstant(TimeZone.getTimeZone("EST").toZoneId()); 

Edit 1 ::

den Offset für eine Zeitzone zu erhalten (können sagen, EST)

int offsetInSeconds = TimeZone.getTimeZone("EST").getRawOffset()/1000; 

ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offsetInSeconds); 

String zoneOffsetString = zoneOffset.toString(); 
// "-05:30" 

Hinweis dieses : in -05:30, müssen wir unsere DateTimeFormat ändern diese, jetzt

DateTimeFormatter dateTimeWithZoneFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm ZZZ"); 

Anforderungen anzupassen, können Sie diese hinzufügen zu jedem dateTimeString,

public String makeOffsetAwareDateTimeString(String dateTimeString, String timezone) { 
    int offsetInSeconds = TimeZone.getTimeZone(timezone).getRawOffset()/1000; 
    ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offsetInSeconds); 
    String zoneOffsetString = zoneOffset.toString(); 
    return dateTimeString + " " + zoneOffsetString; 
} 
+0

Danke :) sarvesh, Kannst du mir bitte sagen, wie bekomme ich Zeitzone Offset für andere zoneId ist wie PMST ist UTC-0300 –

+0

Hinzugefügt den Weg, Offset von Zeitzone bekommen. –

0

Das funktioniert für mich. Ändern Sie für welche Zone auch immer benötigt wird.

public class ZonedDateTime { 

    private static final String DATE_FORMAT = "dd/M/yyyy hh:mm:ss a"; 

    public static void main(String[] args) { 

     String dateInString = "26/12/2017 10:15:55 AM"; 
     LocalDateTime ldt = LocalDateTime.parse(dateInString, DateTimeFormatter.ofPattern(DATE_FORMAT)); 

     ZoneId newYokZoneId = ZoneId.of("America/New_York"); 
     ZonedDateTime nyDateTime =ldt.atZone(newYokZoneId); 
     System.out.println("Date (New York) : " + nyDateTime); 

     DateTimeFormatter format = DateTimeFormatter.ofPattern(DATE_FORMAT); 
     System.out.println("Date (New York) : " + format.format(nyDateTime)); 

    } 

} 

Finden Sie alle Zonen dieses.

TreeSet<String> sortedZones = new TreeSet<>(ZoneId.getAvailableZoneIds()); 

    for (String zone : sortedZones) { 
      System.out.println(zone); 
    } 
0

Vermeiden pseudo-Zonen

niemals die oft in den Medien gesehen 3-4 Buchstaben-Abkürzungen verwenden, wie CST, IST und EST. Diese sind nicht echte Zeitzonen, sind nicht standardisiert und sind nicht einmal einzigartig (!).

wahre Zeitzonen: continent/region

Stattdessen bestimmen Ihre wahre Zeitzone bestimmt. Time zones have names im Format continent/region wie America/Montreal und Africa/Casablanca und Pacific/Auckland.

Ändern Sie Ihre Eingabe, um den ISO 8601-Standardformaten zu entsprechen.

String input = "2017/04/30 08:10".replace(" " , "T") ; 

Parse als LocalDateTime als Eingabe fehlt ein Indikator für Offset-from-UTC oder Zeitzone.

LocalDateTime ldt = LocalDateTime.parse(input) ; 

Wenden Sie eine Zeitzone an, wenn Sie sicher sind, dass sie für diesen Eingang bestimmt ist.