在Java 8及更高版本的java.time框架中,Duration
类说:
此类以秒和纳秒为单位模拟一个数量或时间量。可以使用其他基于持续时间的单位访问它,例如分钟和小时。此外,
DAYS
单位可以使用,并且被视为完全等于24小时,因此忽略了夏令时效果。
然而,当我调用get
方法并传递ChronoUnit.DAYS
时,会抛出异常。
LocalTime start = LocalTime.of ( 0 , 0 , 0 ); // First moment of the day.
LocalTime stop = LocalTime.of ( 2 , 0 , 0 ); // 2 AM.
Duration duration = Duration.between ( start , stop );
long days = duration.get ( ChronoUnit.DAYS );
线程“main”中的异常java.time.temporal.UnsupportedTemporalTypeException:不支持的单位:天
我误解了某些内容,还是滥用了这些课程?
答案 0 :(得分:6)
持续时间类get
的文档。
获取所请求单位的值。 这将为两个支持的单元SECONDS和NANOS中的每一个返回一个值。所有其他单位都会例外。
但是,Duration
类有一个名为toDays
的方法:
获取此持续时间内的天数。 这将通过将秒数除以86400来返回持续时间内的总天数。这是基于一天的标准定义为24小时。
答案 1 :(得分:3)
遗憾的是,get(TemporalUnit)
方法令人困惑,并非针对大多数用户。要了解原因,请参阅this answer。
Java SE 9将为Duration
提供更丰富的访问方法。目前,您可以使用toDays()
获取总天数。
Javadoc并非完全错误,但可能并非完全有用。该课程确实在toDays()
,ofDays(), plusDays()
等24小时内提供了一些支持。只是get(TemporalUnit)
方法被误导性地命名(应为internalGet(TemporalUnit)
或一些这样的名字)。
答案 2 :(得分:0)
A.最好更换
LocalTime start = LocalTime.of(0, 0, 0); // First moment of the day.
与
LocalTime start = LocalTime.MIN; // First moment of the day.
或与
LocalTime start = LocalTime.MIDNIGHT; // First moment of the day.
还有以下内容
LocalTime stop = LocalTime.of ( 2 , 0 , 0 ); // 2 AM.
可以替换为
LocalTime stop = LocalTime.of ( 2 , 0 ); // 2 AM.
B.您遇到的异常是预期行为,并且已在 Duration
中记录:
这将返回两个支持单位中的每一个的值,SECONDS 和 纳米。所有其他单位抛出异常。
您可以使用 Duration#getUnits
获取支持的单位列表,不幸的是它被声明为非静态函数(因此您必须创建任意持续时间才能使用它):
import java.time.Duration;
public class Main {
public static void main(String[] args) {
Duration duration = Duration.ofDays(10);// An arbitrary duration
System.out.println(duration.getUnits());
}
}
输出:
[Seconds, Nanos]