使用 Java Time API 将时间标量添加到现在并转换为日期

问题描述 投票:0回答:2

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
.

java java-11 java-time
2个回答
1
投票

tl;博士

你的问题很混乱。但我猜你想知道从现在开始几分钟后的日历日期,正如通过 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 类取代的糟糕日期时间类的一部分。


1
投票

这不会抛出任何错误,但会返回一个包含 当前一天的开始时间 (00:00:00) 时间部分。谁能发现 我哪里出错了?我只想要代表现在的日期 + 添加分钟数

调用

toLocalDate()
并使用
atStartOfDay()
将时间重新设置为 startOfDay 时,您正在丢失时间组件:

Date expiry = Date.from(expiryLdt.toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant());

尝试:

Date expiry = Date.from(expiryLdt.toInstant(ZoneId.systemDefault()));
© www.soinside.com 2019 - 2024. All rights reserved.