Java 11 在这里。我正在尝试使用
LocalDateTime.now()
并为其添加一定数量的分钟数 (minToAdd
),并将结果转换为新的 Date
即我的 LocalDateTime.now()
plus minsToAdd
。我不想使用 Joda 或任何其他库,因为我确信 Java 完全有能力为我做这件事。我想尽可能避免使用 Calendar
代替 LocalDateTime
因为这似乎是新的 + 推荐的 API。
我最好的尝试:
LocalDateTime nowLdt = LocalDateTime.now();
LocalDateTime expiryLdt = nowLdt.plusMinutes(minsToAdd);
Date expiry = Date.from(expiryLdt.toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
这不会引发任何错误,但会返回一个包含当天开始时间 (00:00:00) 时间组件的
Date
。谁能发现我哪里出错了?我只想要代表现在的 Date
+ minsToAdd
.
你的问题很混乱。但我猜你想知道从现在开始几分钟后的日历日期,正如通过 JVM 当前的默认时区所看到的那样。
LocalDate ld =
Instant
.now()
.plus( Duration.ofMinutes( someNumber ) )
.atZone( ZoneId.systemDefault() ) // For any given moment, the date varies around the globe by time zone.
.toLocalDate()
;
我无法想象打电话
LocalDateTime.now
是正确的事情的情况。
LocalDateTime
类故意缺少任何时区概念或与 UTC 的偏移量。
要以 UTC 格式捕获当前时刻,请使用
Instant
。
Instant now = Instant.now() ;
如果您想要几分钟后的片刻,请致电
plus
。
Duration d = Duration.ofMinutes( someNumber ) ;
Instant later = now.plus( d ) ;
最好避免
java.util.Date
。但是如果你必须有一个实例来与尚未更新到 java.time 的旧代码进行互操作,你可以转换。查看添加到遗留类的新转换方法。
java.util.Date utilDate = java.util.Date.from( later ) ;
如果您的目标是查看包含稍后时刻的日历日期,请指定时区 (
ZoneId
) 以确定 LocalDate
对象。
ZoneId z = … ; // If you want to use the JVM’s current default time zone: ZoneId.systemDefault()
ZonedDateTime zdt = later.atZone( z ) ;
LocalDate ld = later.toLocalDate() ;
避免两个
Date
类。与 Calendar
一起,它们是多年前被现代 java.time 类取代的糟糕日期时间类的一部分。
这不会抛出任何错误,但会返回一个包含 当前一天的开始时间 (00:00:00) 时间部分。谁能发现 我哪里出错了?我只想要代表现在的日期 + 添加分钟数
调用
toLocalDate()
并使用 atStartOfDay()
将时间重新设置为 startOfDay 时,您正在丢失时间组件:
Date expiry = Date.from(expiryLdt.toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
尝试:
Date expiry = Date.from(expiryLdt.toInstant(ZoneId.systemDefault()));