Java 11:LocalDateTime添加分钟转Date出现时间异常问题
Java 11 LocalDateTime转Date的问题修复
问题根源
你代码里的错误出在这一行:
expiryLdt.toLocalDate().atStartOfDay(ZoneId.systemDefault())
toLocalDate()会丢弃LocalDateTime中的时分秒信息,只保留日期部分,接着调用atStartOfDay()会直接生成当天00:00:00的ZonedDateTime,最终转换后的Date自然是零点时间。
正确实现
不需要截断日期部分,直接给LocalDateTime关联时区后转换为Instant,再生成Date即可:
LocalDateTime nowLdt = LocalDateTime.now(); LocalDateTime expiryLdt = nowLdt.plusMinutes(minsToAdd); // 直接将LocalDateTime绑定系统时区转为ZonedDateTime,再生成Instant Date expiry = Date.from(expiryLdt.atZone(ZoneId.systemDefault()).toInstant());
也可以简化为一行:
Date expiry = Date.from(LocalDateTime.now().plusMinutes(minsToAdd).atZone(ZoneId.systemDefault()).toInstant());
原理说明
LocalDateTime是无时区的本地日期时间对象,无法直接转换为Instant(UTC时间戳)。通过atZone(ZoneId.systemDefault())将其绑定到系统默认时区,得到包含完整时间和时区信息的ZonedDateTime,再调用toInstant()就能得到正确的UTC时间戳,最后用Date.from()转换为Date对象,就能保留正确的时分秒信息。
内容的提问来源于stack exchange,提问作者simplezarg
相关产品推荐
相关产品推荐

