webentwicklung-frage-antwort-db.com.de

Java 8 Konvertiert die angegebene Zeit und Zeitzone in UTC-Zeit

Ich habe eine Zeit mit String-Typ wie: "2015-01-05 17:00" und ZoneId ist "Australia/Sydney".

Wie kann ich diese Zeitinformationen mithilfe der Java 8-Datetime-API in die entsprechende UTC-Zeit konvertieren?

Auch müssen DST-Sachen berücksichtigt werden.

28
ttt

Sie suchen die ZonedDateTime-Klasse in Java8 - eine vollständige Datums-Zeit mit Zeitzone und aufgelöstem Offset von UTC/Greenwich. In Bezug auf das Design sollte diese Klasse in erster Linie als Kombination von LocalDateTime und ZoneId betrachtet werden. Die Variable ZoneOffset ist eine wichtige, aber sekundäre Information, mit der sichergestellt wird, dass die Klasse einen Moment darstellt, insbesondere während einer Überschneidung der Sommerzeit.

Zum Beispiel:

ZoneId australia = ZoneId.of("Australia/Sydney");
String str = "2015-01-05 17:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter);
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia );

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney);

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC);

System.out.println("Current date and time in UTC : " + utcDate);
48
Mateusz Sroka

Eine Alternative zu der vorhandenen Antwort besteht darin, den Formatierer mit der entsprechenden Zeitzone einzurichten:

String input = "2015-01-05 17:00";
ZoneId zone = ZoneId.of("Australia/Sydney");

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone);
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC);

Da Sie mit einer Datenbank interagieren möchten, benötigen Sie möglicherweise einen Java.sql.Timestamp. In diesem Fall müssen Sie nicht explizit in eine UTC-Zeit konvertieren, sondern können stattdessen einen Instant verwenden:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt);
Timestamp sqlTs = Timestamp.from(zdt.toInstant());
15
assylias
   **// Refactored Logic**     

        ZoneId australia = ZoneId.of("Australia/Sydney");
        ZoneId utcZoneID= ZoneId.of("Etc/UTC");
        String ausTime = "2015-01-05 17:00";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

        //converting in datetime of Java8
        LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter);

        // DateTime With Zone
        ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID);
        // output - 2015-01-05T17:00Z[Etc/UTC]

        // With Formating DateTime
        String utcDateTime = utcDateAndTime.format(formatter);
        // output - 2015-01-05 17:00
0
Mukesh