web-dev-qa-db-ja.com

オフセットが適用されたZonedDateTimeからUTCへ?

Java 8を使用しています
これは私のZonedDateTimeがどのように見えるかです

2013-07-10T02:52:49+12:00

私はこの値を次のように取得します

z1.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)

ここで、z1ZonedDateTimeです。

この値を2013-07-10T14:52:49として変換したかった

どうやってやるの?

7
daydreamer

これは、あなたの望むことですか?これは、以前にZonedDateTimeLocalDateTimeに変換することにより、指定されたZoneIdZonedDateTimeInstantに変換します。

LocalDateTime localDateTime = LocalDateTime.ofInstant(z1.toInstant(), ZoneOffset.UTC);

または、ハードコードされたUTCではなく、ユーザーのシステムタイムゾーンが必要な場合もあります。

LocalDateTime localDateTime = LocalDateTime.ofInstant(z1.toInstant(), ZoneId.systemDefault());
9
SimMac

@SimMac明快さをありがとう。私も同じ問題に直面し、彼の提案に基づいて答えを見つけることができました。

public static void main(String[] args) {
    try {
        String dateTime = "MM/dd/yyyy HH:mm:ss";
        String date = "09/17/2017 20:53:31";
        Integer gmtPSTOffset = -8;
        ZoneOffset offset = ZoneOffset.ofHours(gmtPSTOffset);

        // String to LocalDateTime
        LocalDateTime ldt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(dateTime));
        // Set the generated LocalDateTime's TimeZone. In this case I set it to UTC
        ZonedDateTime ldtUTC = ldt.atZone(ZoneOffset.UTC);
        System.out.println("UTC time with Timezone          : "+ldtUTC);

        // Convert above UTC to PST. You can pass ZoneOffset or Zone for 2nd parameter
        LocalDateTime ldtPST = LocalDateTime.ofInstant(ldtUTC.toInstant(), offset);
        System.out.println("PST time without offset         : "+ldtPST);

        // If you want UTC time with timezone
        ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
        ZonedDateTime zdtPST = ldtUTC.toLocalDateTime().atZone(zoneId);
        System.out.println("PST time with Offset and TimeZone   : "+zdtPST);

    } catch (Exception e) {
    }
}

出力:

UTC time with Timezone          : 2017-09-17T20:53:31Z
PST time without offset         : 2017-09-17T12:53:31
PST time with Offset and TimeZone   : 2017-09-17T20:53:31-08:00[America/Los_Angeles]
3
Neero

フォーマッタに送信する前に、目的のタイムゾーン(UTC)に変換する必要があるようです。

z1.withZoneSameInstant( ZoneId.of("UTC") )
  .format( DateTimeFormatter.ISO_OFFSET_DATE_TIME )

2018-08-28T17:41:38.213Zのようなものが表示されます

3
DaveTPhD