将Java 8 ISO 8601持续时间表达式添加到java.util.Date

我有一个表达式,如“ PT20.345S”,“ P2DT3H4M”等,如此处所述https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java.lang.CharSequence-

我如何解析它,将其添加到当前时间并获得java.util.Date对象?

都不起作用:

Date d1 = Date.from(LocalDateTime.now().plus(Duration.parse(_expression)));
Date d2 = Date.from(Duration.parse(_expression).addTo(LocalDateTime.now()));

解决方法:

Duration amountToAdd = Duration.parse("PT20.345S");  // Represent a span of time. Here, about twenty and a third seconds.
Instant now = Instant.now() ;                        // Capture the current moment in UTC.
Instant otherMoment = now.plus(amountToAdd);         // Add the span-of-time to the current moment, for a moment in the future (or in the past if the duration is negative).
String output = otherMoment.toString():              // Generate a String in standard ISO 8601 format.

2018-06-30T19:34:47Z

从现代的java.time类转换为遗留类.

Date date1 = Date.from(otherMoment);
System.out.println(date1);

我刚在欧洲/哥本哈根时区运行,得到了:

Sat Jun 30 21:34:47 CEST 2018

如果我使用您的其他示例持续时间字符串P2DT3H4M,则会得到:

Tue Jul 03 00:38:26 CEST 2018

或者,如果您喜欢一线客:

    Date date1 = Date.from(Instant.now().plus(Duration.parse("PT20.345S")));

java.util.Date类早已过时,因此理想情况下,您不希望拥有一个.如果仍然需要一个,通常是对于无法更改或现在不想更改的旧版API,则在使用现代Java日期和时间API java.time进行尽可能多的逻辑时,您正在正确考虑,并仅在最后转换为日期. Date在现代世界中最亲密的表亲是Instant,并且存在Instant和Date之间的直接转换,这就是我使用此类的原因. Instant也很可爱,与时区偏移和时区无关.

上一篇:按ISO日期对PHP数组排序


下一篇:PHP-使用ISO 8601显示实际时间