【发布时间】:2021-04-12 00:16:26
【问题描述】:
我正在尝试找出美国的夏令时开始时间,即 2021 年 3 月 14 日凌晨 2:00,但我的代码返回 2021 年 3 月 14 日凌晨 3:00。我无法理解这一小时的时差。我的代码如下:
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.time.zone.ZoneOffsetTransition;
import java.time.zone.ZoneRules;
class DST{
public static void main(String[] args) {
ZoneId zoneId = ZoneId.of("America/New_York");
ZoneRules rules = zoneId.getRules();
ZoneOffsetTransition nextTransition = rules.nextTransition(Instant.now());
Timestamp ts = Timestamp.valueOf(nextTransition.getInstant().atZone(zoneId).toLocalDateTime());
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d, yyyy 'at' h:mm a");
String date = sdf.format(ts);
system.out.println("DST time:"+ date );
}
}
日期值是March 14, 2021 at 3:00 AM,但它应该是March 14, 2021 at 2:00 AM。一小时的时差我看不懂?
【问题讨论】:
-
不确定,但您是否尝试过打印
getInstant().atZone(zoneId)返回的ZonedDateTime而不是将其转换为LocalDateTime? -
@Hulk:它返回
2021-03-14T03:00-04:00[America/New_York] -
为什么要将旧的日期和时间 API 与
java.time包中的新 API 混合使用? -
但是当转换发生在凌晨 2 点时,这意味着时钟向前拨到了 3 点,所以在那个时间点 IS 是凌晨 3 点。你得到了正确的结果。