ZonedDateTime调用plusDays等方法后时间未变化,求原因及解决
问题分析与解决
你的问题核心是忽略了Java时间API中ZonedDateTime的不可变性:
ZonedDateTime属于不可变类,所有诸如plusDays()、withHour()这类修改时间的方法,都不会直接修改原对象本身,而是返回一个包含修改后时间的新ZonedDateTime实例。你的代码只是调用了这些方法,但没有接收并使用返回的新实例,因此始终在操作最初的zdt对象,时间戳自然不会变化。
修正后的代码示例
val zdt: ZonedDateTime = ZonedDateTime.now() println("${zdt.toInstant().toEpochMilli()}") // 接收plusDays返回的新实例 val zdtNextDay = zdt.plusDays(1) println("${zdtNextDay.toInstant().toEpochMilli()}") // 链式调用with系列方法,每次都会生成新实例 val zdtMidnight = zdt.withHour(0).withMinute(0).withSecond(0) println("${zdtMidnight.toInstant().toEpochMilli()}")
补充说明
Java时间API(如ZonedDateTime、LocalDateTime等)的不可变设计,是为了保证线程安全、避免意外的副作用。所有修改时间的操作都遵循"返回新实例"的规则,原实例会保持初始状态不变。
内容的提问来源于stack exchange,提问作者tyczj
相关产品推荐
相关产品推荐

