在不更改实际日期的情况下指定 ZonedDateTime 的时区
Specify timezone of ZonedDateTime without changing the actual date
我有一个包含日期(不是当前日期)的 Date 对象,我需要以某种方式指定此日期为 UTC,然后将其转换为 "Europe/Paris",即 +1 小时。
public static LocalDateTime toLocalDateTime(Date date){
return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC), ZoneId.of("Europe/Paris")).toLocalDateTime();
}
给定日期“2018-11-08 15:00:00”,这会将日期转换为“2018-11-08 14:00:00”。我需要它从 UTC 转换为 Europe/Paris - 而不是相反。
ZonedId zoneId = ZoneId.of("Europe/Paris");
return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(),zonedId);
尝试定义 Europe/Paris
的 ZoneId
您可以使用 ZonedDateTime.withZoneSameInstant()
方法从 UTC 时间移动到巴黎时间:
Date date = new Date();
ZonedDateTime utc = date.toInstant().atZone(ZoneOffset.UTC);
ZonedDateTime paris = utc.withZoneSameInstant(ZoneId.of("Europe/Paris"));
System.out.println(utc);
System.out.println(paris);
System.out.println(paris.toLocalDateTime());
打印:
2018-11-08T10:25:18.223Z
2018-11-08T11:25:18.223+01:00[Europe/Paris]
2018-11-08T11:25:18.223
由于老式的Date
对象没有任何时区,你可以完全忽略UTC,直接转换为Europe/Paris:
private static final ZoneId TARGET_ZONE = ZoneId.of("Europe/Paris");
public static LocalDateTime toLocalDateTime(Date date){
return date.toInstant().atZone(TARGET_ZONE).toLocalDateTime();
}
不过我不确定你为什么要 return 一个 LocalDateTime
。那就是丢弃信息。在大多数情况下,我会省略 .toLocalDateTime()
,而只是 return 来自 atZone
的 ZonedDateTime
。
我有一个包含日期(不是当前日期)的 Date 对象,我需要以某种方式指定此日期为 UTC,然后将其转换为 "Europe/Paris",即 +1 小时。
public static LocalDateTime toLocalDateTime(Date date){
return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC), ZoneId.of("Europe/Paris")).toLocalDateTime();
}
给定日期“2018-11-08 15:00:00”,这会将日期转换为“2018-11-08 14:00:00”。我需要它从 UTC 转换为 Europe/Paris - 而不是相反。
ZonedId zoneId = ZoneId.of("Europe/Paris");
return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(),zonedId);
尝试定义 Europe/Paris
的 ZoneId您可以使用 ZonedDateTime.withZoneSameInstant()
方法从 UTC 时间移动到巴黎时间:
Date date = new Date();
ZonedDateTime utc = date.toInstant().atZone(ZoneOffset.UTC);
ZonedDateTime paris = utc.withZoneSameInstant(ZoneId.of("Europe/Paris"));
System.out.println(utc);
System.out.println(paris);
System.out.println(paris.toLocalDateTime());
打印:
2018-11-08T10:25:18.223Z
2018-11-08T11:25:18.223+01:00[Europe/Paris]
2018-11-08T11:25:18.223
由于老式的Date
对象没有任何时区,你可以完全忽略UTC,直接转换为Europe/Paris:
private static final ZoneId TARGET_ZONE = ZoneId.of("Europe/Paris");
public static LocalDateTime toLocalDateTime(Date date){
return date.toInstant().atZone(TARGET_ZONE).toLocalDateTime();
}
不过我不确定你为什么要 return 一个 LocalDateTime
。那就是丢弃信息。在大多数情况下,我会省略 .toLocalDateTime()
,而只是 return 来自 atZone
的 ZonedDateTime
。