Java8日期/时间API中的Duration类

Java8日期/时间API中的Duration类,java,datetime,Java,Datetime,我需要解释一下为什么这段代码不能编译: Duration duration = Duration.from(ChronoUnit.DAYS); 错误: 类型Duration中的fromTemporalAmount方法不适用 因为它的争论 正如文件所述: 公共静态持续时间fromTemporalAmount获得一个实例 从一个时间量开始的持续时间。这将根据以下内容获得持续时间: 指定的金额。TemporalAmount表示一个时间量, 可以是基于日期或基于时间的,此工厂提取 持续时间 转换将围绕

我需要解释一下为什么这段代码不能编译:

Duration duration = Duration.from(ChronoUnit.DAYS);
错误:

类型Duration中的fromTemporalAmount方法不适用 因为它的争论

正如文件所述:

公共静态持续时间fromTemporalAmount获得一个实例 从一个时间量开始的持续时间。这将根据以下内容获得持续时间: 指定的金额。TemporalAmount表示一个时间量, 可以是基于日期或基于时间的,此工厂提取 持续时间

转换将围绕数量和使用的单位集循环 用于计算总持续时间的单位持续时间。只有一个 此方法接受单位子集。该单元必须具有 一个精确的持续时间或时间,它被视为24小时。 如果找到任何其他单元,则会引发异常

参数:amount-要转换的时间量,非空返回: 等效的持续时间,非空抛出:DateTimeException-if 无法转换为持续时间算术异常-如果为数字 溢出发生

我知道还有其他方法可以创建duration实例,但我需要解释一下为什么这个方法不起作用

编辑

当我这样更改时,因为Period实现了TemporalAmount接口:

Duration d1 = Duration.from(Period.ofDays(1));
它认为这是一个例外:

主线程中的异常 java.time.temporal.UnsupportedTemporalTypeException:单位不能 估计持续时间


提前感谢。

您的问题已经提到此方法需要一个临时计数。该接口的示例告诉我们:

定义时间量的框架级接口,例如6小时、8天或2年3个月

时间不是暂时的。它只是一个时间度量单位。但不是数量:ChronoUnit实现了TemporalUnit,而不是TemporalAmount

换句话说:小时不是一个数量。6个小时就够了

换句话说:您可以从度量单位创建持续时间。您需要提供表示特定时间量的内容

例如:

Duration d = Duration.from(Duration.ofSeconds(5));

应作为持续时间实现临时计数。在该示例中,您首先定义一个5秒的TemporalAmount,然后可以从中构建。

您的问题已经提到此方法需要一个TemporalAmount。该接口的示例告诉我们:

定义时间量的框架级接口,例如6小时、8天或2年3个月

时间不是暂时的。它只是一个时间度量单位。但不是数量:ChronoUnit实现了TemporalUnit,而不是TemporalAmount

换句话说:小时不是一个数量。6个小时就够了

换句话说:您可以从度量单位创建持续时间。您需要提供表示特定时间量的内容

例如:

Duration d = Duration.from(Duration.ofSeconds(5));

应作为持续时间实现临时计数。在该示例中,您首先定义了5秒的时间计数,然后可以从中进行构建。

我相信@GhostCat的答案充分说明了如何正确使用Duration.from以及为什么ChronoUnit.DAYs不起作用。然而,我想澄清你困惑的根源,以及你认为它应该起作用的原因

这句话:

该装置必须具有准确的持续时间,或是计时。天,即24小时

提到了ChronoUnit.DAYS,因为ChronoUnit.DAYS是一个估计值,设置为24小时,与其他时间不同,它不是一个精确的持续时间。这并不意味着你可以简单地通过它。天,它会像24小时的时间山

从解释ChronoUnit.DAYS的文档中可以看出,这是一个估算

将句子改写为不那么容易混淆的句子:

除ChronoUnit.DAYS(估计为24小时)外,装置必须具有准确的持续时间


我相信@GhostCat的回答充分解释了如何正确使用Duration.from以及为什么ChronoUnit.DAYs不起作用。然而,我想澄清你困惑的根源,以及你认为它应该起作用的原因

这句话:

该装置必须具有准确的持续时间,或是计时。天,即24小时

提到了ChronoUnit.DAYS,因为ChronoUnit.DAYS是一个估计值,设置为24小时,与其他时间不同,它不是一个精确的持续时间。这并不意味着你可以简单地通过它。天,它会像24小时的时间山

从解释ChronoUnit.DAYS的文档中可以看出,这是一个估算

将句子改写为不那么容易混淆的句子:

除ChronoUnit.DAYS(估计为24小时)外,装置必须具有准确的持续时间


我相信这里的混淆是实现了TemporalAmount接口的Period对象不能代替也实现了TemporalAmount接口的Duration对象。 代码:

这是b ecause Duration.from方法只接受ChronoUnit值的子集,该值可准确转换为小时:

此方法仅接受单元的子集。该单位必须 要么有一个确切的持续时间,要么是治疗的时间 24小时

根据定义,其1天P1D的值可能为23或24小时,具体取决于夏令时间隔。因此,Period没有固定的单位值,其1天始终为24小时,因此会抛出UnsupportedTemporalTypeException。 从接口文档中:

Period是基于日期的实现,存储年、月和日。 Duration是基于时间的实现,存储秒和秒 纳秒,但提供一些使用其他基于持续时间的访问 单位,如分钟、小时和固定的24小时工作日


我相信这里的混淆是实现了TemporalAmount接口的Period对象不能代替也实现了TemporalAmount接口的Duration对象。 代码:

这是因为Duration.from方法只接受ChronoUnit值的子集,这些值可以准确转换为小时:

此方法仅接受单元的子集。该单位必须 要么有一个确切的持续时间,要么是治疗的时间 24小时

根据定义,其1天P1D的值可能为23或24小时,具体取决于夏令时间隔。因此,Period没有固定的单位值,其1天始终为24小时,因此会抛出UnsupportedTemporalTypeException。 从接口文档中:

Period是基于日期的实现,存储年、月和日。 Duration是基于时间的实现,存储秒和秒 纳秒,但提供一些使用其他基于持续时间的访问 单位,如分钟、小时和固定的24小时工作日


它代表多少天?你误读了。24小时是天数单位的长度。您仍然需要指定多少个单位。单位不是金额-天数不是金额,而是用于表示金额的单位。你想卖多少钱?我要美元!1美元等于100%,我只是在尝试,用Period.ofdays 1创建一个0年、0个月、1天的周期,它不会转换,因为它包含年和月,即使金额为零。看起来像个虫子。我使用的是Java1.8.0µ。我想知道它是否在以后的版本中修复了?该死。也不适用于JDK 12或JDK 13:它代表多少天?你误读了。24小时是天数单位的长度。您仍然需要指定多少个单位。单位不是金额-天数不是金额,而是用于表示金额的单位。你想卖多少钱?我要美元!1美元等于100%,我只是在尝试,用Period.ofdays 1创建一个0年、0个月、1天的周期,它不会转换,因为它包含年和月,即使金额为零。看起来像个虫子。我使用的是Java1.8.0µ。我想知道它是否在以后的版本中修复了?该死。也不适用于JDK 12或JDK 13:文档确实指出,该单位必须有一个确切的持续时间,或者是ChronoUnit.DAYS,它被视为24小时,这使得它似乎有一个ChronoUnit.DAYS的特例,默认为24小时。@Nexevis该单位仍然是一个单位。该方法需要的是TemporalAmount,而不是…单位。@Nexevis这些是TemporalAmount中的单位,可以是一个持续时间,也可以是一个期间。@Nexevis-ahh,明白了,这更像是在天中并不总是24小时,但持续时间被实现为使用24小时hours@CarlosHeuberger是的没错,医生可能会在这里说得更好。医生确实说这个单位必须有一个确切的持续时间,或者是ChronoUnit.DAYS,它被视为24小时,这使得它似乎有一个ChronoUnit.DAYS的特例,默认为24小时。@Nexevis这个单位仍然是一个单位。该方法需要的是TemporalAmount,而不是…单位。@Nexevis这些是TemporalAmount中的单位,可以是一个持续时间,也可以是一个期间。@Nexevis-ahh,明白了,这更像是在天中并不总是24小时,但持续时间被实现为使用24小时hours@CarlosHeuberger是的,没错,医生可能会在这里说得更好。