使用以下代码:

class Test {
    public static void main(String [] args) {
        LocalDate date = LocalDate.of(2018, 11, 4);
        LocalTime time = LocalTime.of(1, 59);
        ZonedDateTime dt = ZonedDateTime.of(date, time, ZoneId.of("America/New_York"));
        System.out.println(dt.getHour() + ":" + dt.getMinute() + ":" + dt.getSecond());
        dt = dt.plusMinutes(1);
        System.out.println(dt.getHour() + ":" + dt.getMinute() + ":" + dt.getSecond());
        dt = dt.plusMinutes(59);
        System.out.println(dt.getHour() + ":" + dt.getMinute() + ":" + dt.getSecond());
        dt = dt.plusMinutes(1);
        System.out.println(dt.getHour() + ":" + dt.getMinute() + ":" + dt.getSecond());
    }
}

我明白了

1:59:0
1:0:0
1:59:0
2:0:0

有没有办法从夏时制之后到1:00:00而不经过夏时制之前的1:00:00?

推荐答案

使用ofStrict指定所生成的分区日期时间的偏移量.America/New_York在相关时间从-04:00变为-05:00,所以需要ZoneOffset.ofHours(-5).

ZonedDateTime dt = ZonedDateTime.ofStrict(
    LocalDateTime.of(date, time), 
    ZoneOffset.ofHours(-5), 
    ZoneId.of("America/New_York")
);

如果无法硬编码中的偏移量,可以使用以下命令获得偏移量:

var dateTime = LocalDateTime.of(date, time)
var zone = ZoneId.of("America/New_York");
var offsetAfter = zone.getRules()
    .getTransition(dateTime)
    .getOffsetAfter();
ZonedDateTime dt = ZonedDateTime.ofStrict(
    dateTime, 
    offsetAfter, 
    zone
);

或者,正如Ole V.V.所指出的,你也可以使用更短的:

ZonedDateTime dt = ZonedDateTime.of(
    date, time, ZoneId.of("America/New_York")
).withLaterOffsetAtOverlap();

Java相关问答推荐

在FML中删除关键帧动画

伪类focus-in不适用于PFA中的选项卡

我应该避免在Android中创建类并在运行时编译它们吗?

JPackaged应用程序启动MSI调试,然后启动System. exit()

如何在访问完所有文件后加入所有线程?

Java函数式编程中的双值单值映射

路径映射未发生

Java inline Double条件和值解装箱崩溃

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

Java:使用Class.cast()将对象转换为原始数组

虚拟线程应该很快消亡吗?

如何在Java中为thunk创建映射器函数

无法播放音频:从资源加载库GStreamer-Lite失败

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

为什么相同的数据条码在视觉上看起来不同?

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

@此处不能应用可为null的批注

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为