当前位置: 首页 > 知识库问答 >
问题:

Java8日期/时间API中的持续时间类

谯皓君
2023-03-14

我需要一些解释为什么这个代码不编译:

Duration duration = Duration.from(ChronoUnit.DAYS);

错误:

类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit)

正如本文所述:

public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间的,该工厂将其提取为一个持续时间。

转换循环使用金额中的一组单位,并使用单位的持续时间来计算总持续时间。这种方法只接受一部分单位。该单元必须具有精确的持续时间或计时。被视为24小时的天数。如果找到任何其他单元,则会引发异常。

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

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

编辑

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

Duration d1 = Duration.from(Period.ofDays(1));

它thow这个例外:

线程"main"中的异常java.time.temporal.不支持的时间类型异常:单元必须没有估计的持续时间

提前感谢。

共有3个答案

东方飞捷
2023-03-14

我认为这里的困惑在于Period对象(实现TemporalAmount接口)不能代替Duration对象(也实现TemporalAmount接口)
在代码中:

// Below does not work
Duration d1 = Duration.from(Period.ofDays(1));

// This works fine
Duration d1 = Duration.from(Duration.ofHours(24));

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

此方法只接受单位的子集。该单位必须具有确切的持续时间或为ChronoUnit. DAYS,该单位被视为24小时

根据时段定义,其1天(P1D)的值可能是23或24小时,具体取决于夏令时间隔。因此,Period没有固定的单位值,1天总是24小时,因此会抛出不受支持的时间类型异常来自TemporalAmount接口文档:

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

苏彭薄
2023-03-14

我相信@GhostCat的答案充分说明了如何正确使用持续时间。从和为什么开始。天不起作用。然而,我想澄清你困惑的根源,以及你认为它应该起作用的原因。

这句话:

该单位必须有一个确切的持续时间或ChronoUnit. DAYS,视为24小时。

提到ChronoUnit。DAYS是因为ChronoUnit。DAYS是一个设置为24小时的估计值,它不像其他人一样是一个精确的持续时间。这并不意味着您可以简单地传递ChronoUnit。DAYS,它将像24小时的TemporalAmount一样起作用。

来源于解释它的文档。天数是一个估计值。

将句子改写为不那么令人困惑的句子:

该单位必须有一个确切的持续时间,除非ChronoUnit. DAYS估计为24小时。

翟淮晨
2023-03-14

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

框架级接口定义一个时间量,如“6小时”、“8天”或“2年3个月”。

ChronoUnit. DAYS不是一个时间量。它只是一个时间计量单位。但不是一个量:ChronoUnit实现了TemporalUnit,而不是TemporalAmount

换句话说,“小时”不是一个数量。“6小时是”!

换句话说:你可以从一个测量单位创建一个持续时间。你需要提供一些代表特定时间的东西。

例:

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

应该有效(因为持续时间实现了时间计数)。在这个例子中,你首先定义了一个5秒的时间量,然后你就可以根据这个时间量进行构建。

 类似资料:
  • 也许有人能给我举个例子?我在问自己,新的日期和时间API的改进来自哪里。

  • 在PowerShell中,有没有办法将ISO 8601指定的持续时间转换成DateTime对象?例如,PT30M是30分钟前,因此如果现在的时间是< code>2019-07-31 17:00:00,我希望时间戳为< code>2019-07-31 16:30:00。 我尝试过显而易见的 - 但这(毫不奇怪地失败了) Get Date:输入对象不能绑定到命令的任何参数,因为命令不接受管道输入,或者

  • 何时何地哪个更可取? 我不知道他们之间到底有什么区别。 来自LocalDateTime的文档 ...时间表示为纳秒精度。例如,值“2007 年 10 月 2 日 13:45.30.123456789”可以存储在 LocalDateTime 中。 我假设LocalDateTime也可以接受纳秒。所以我想,我可以用LocalDateTime替换我的代码,它们被声明为TimeStamp。如果我错了,请纠

  • 我有DateTime字符串2020-04-03 01:29:27和2020-04-03 01:29:37我想得到持续时间在小时。我已经尝试了很多东西,但这却找不到任何帮助

  • 问题内容: 我有一个价值,我想得到另一个正好是1个月前的时间。 我知道可以用(想要另一个)进行减法,但这会导致a,而我反过来需要它。 问题答案: 尝试AddDate: 产生: 游乐场:http://play.golang.org/p/QChq02kisT

  • 我正在将一个项目从Joda Time过渡到java8的本机时间库,我遇到了一个障碍。 我一直找不到持续时间的格式化程序。我想有一个自定义的字符串格式,例如HHH MM,其中75小时15分钟的持续时间将格式化为“75 15”。 通过转换为句点并使用句点Formatter,Joda-Time很容易做到这一点,但是我无法在Java8中找到这种类型的类。我错过了什么吗?