web-dev-qa-db-ja.com

Java 8指定された時間とタイムゾーンをUTC時間に変換します

"2015-01-05 17:00"ZoneId"Australia/Sydney"のような文字列型を使用しています。

Java 8日時APIを使用して、この時間情報をUTC時間に対応する方法に変換するにはどうすればよいですか?

また、DSTのものを考慮する必要があります。

32
ttt

Java8のZonedDateTimeクラスを探しています-タイムゾーンとUTC /グリニッジからの解決されたオフセットを備えた完全な日時です。設計の観点から、このクラスは主にLocalDateTimeZoneIdの組み合わせと見なす必要があります。 ZoneOffsetは非常に重要ですが、二次的な情報であり、特に夏時間のオーバーラップ中にクラスがインスタントを表すことを保証するために使用されます。

例えば:

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);
62
Mateusz Sroka

既存の答えに代わるものは、適切なタイムゾーンでフォーマッタをセットアップすることです:

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);

データベースとやり取りするため、Java.sql.Timestampが必要になる場合があります。この場合、UTC時間に明示的に変換する必要はありませんが、代わりにインスタントを使用できます。

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