Java转换UTC / CET时间

时间:2017-03-27 09:33:23

标签: java timezone

我想将给定的日期时间(这是一个utc日期时间)转换为CET中相应的日期时间,并使用欧洲夏季/冬季时间开关(夏令时)的正确映射。我设法使用java.time

反过来(CET到UTC)
public static LocalDateTime cetToUtc(LocalDateTime timeInCet) {
    ZonedDateTime cetTimeZoned = ZonedDateTime.of(timeInCet, ZoneId.of("CET"));
    return cetTimeZoned.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

但我没有采取相反的方式:

public static LocalDateTime utcToCet(LocalDateTime timeInUtc) {
     ZonedDateTime cetTimeZoned = ZonedDateTime.of(timeInUtc,ZoneId.of("UTC"));
     return cetTimeZoned.withZoneSameInstant(ZoneOffset.of(???)).toLocalDateTime(); // what to put here?
 }

我该怎么做?

2 个答案:

答案 0 :(得分:1)

只需使用 ZoneId.of(“CET”)

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {

    public static void main(String args[])
    {
        LocalDateTime date = LocalDateTime.now(ZoneId.of("CET"));
        System.out.println(date);

        LocalDateTime utcdate = cetToUtc(date);
        System.out.println(utcdate);

        LocalDateTime cetdate = utcToCet(utcdate);
        System.out.println(cetdate);
    }

    public static LocalDateTime cetToUtc(LocalDateTime timeInCet) {
        ZonedDateTime cetTimeZoned = ZonedDateTime.of(timeInCet, ZoneId.of("CET"));
        return cetTimeZoned.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
    }

    public static LocalDateTime utcToCet(LocalDateTime timeInUtc) {
         ZonedDateTime utcTimeZoned = ZonedDateTime.of(timeInUtc,ZoneId.of("UTC"));
         return utcTimeZoned.withZoneSameInstant(ZoneId.of("CET")).toLocalDateTime();
     }
}

答案 1 :(得分:1)

TL; DR:在您的两种方法中,使用ZoneId.of("Europe/Rome")(或CET时区中您最喜欢的城市)和ZoneOffset.UTC

正如Jerry06在评论中所说,再次使用ZoneId.of("CET")有效(你已经在第一种方法中使用过它)。

但是,不建议使用三个字母的时区缩写,其中许多都不明确。他们建议您使用其中一个城市时区ID,例如ZoneId.of("Europe/Rome")用于CET(这将从昨天开始为您提供CEST)。他们也推荐ZoneId.of("UTC")而不是ZoneOffset.UTC。传递ZoneOffset有效,因为ZoneOffsetZoneId的子类之一。