当前位置: 首页 > 面试题库 >

为什么在java.time中无法获得以分钟或小时为单位的持续时间?

巫新知
2023-03-14
问题内容

在Java
8和更高版本中可用Duration的新JSR
310
日期API(java.time包)中的类中,javadoc说:

此类以秒和纳秒为单位对时间量或时间量进行建模。 可以使用其他基于持续时间的单位(例如分钟和小时)来访问它
。此外,可以使用DAYS单位并将其视为等于24小时,因此忽略了夏时制的影响。

那么,为什么以下代码会崩溃?

Duration duration = Duration.ofSeconds(3000);
System.out.println(duration.get(ChronoUnit.MINUTES));

这引发了UnsupportedTemporalTypeException

java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Minutes
    at java.time.Duration.get(Duration.java:537)

那么从持续时间对象中提取分钟和小时的推荐方法是什么?我们是否必须根据秒数自己进行计算?为什么采用这种方式?


问题答案:

“为什么要这样实施?”

其他答案涉及toXxx()允许查询小时/分钟的方法。我将尝试解决原因。

TemporalAmount接口和get(TemporalUnit)方法在此过程的后期添加。我个人并不完全相信我们有足够的证据来证明在该领域中进行设计的正确方法,但是我有些不安TemporalAmount。我相信这样做会稍微混淆API。

事后看来,我认为其中TemporalAmount包含正确的方法,但我认为get(TemporalUnit)应该使用不同的方法名称。原因是get(TemporalUnit)本质上是框架级别的方法-
它不是为日常使用而设计的。不幸的是,方法的名称get并不意味着这一点,导致盲蝽象调用get(ChronoUnit.MINUTES)Duration

所以,想的办法get(TemporalUnit)是想象一个低层次的框架观看量为Map<TemporalUnit, Long>这里Duration是一个Map大小两次与中键SECONDSNANOS

在是相同的,这样,Period从低级别的框架看作Map大小三- DAYSMONTHSYEARS(其幸好具有较少错误的几率)。

总体而言,对应用程序代码的最佳建议是忽略该方法get(TemporalUnit)。使用getSeconds()getNano()toHours()toMinutes()来代替。

最后,从a获取“ hh:mm:ss”的一种方法Duration是:

LocalTime.MIDNIGHT.plus(duration).format(DateTimeFormatter.ofPattern("HH:mm:ss"))

一点都不漂亮,但是它的有效期不到一天。

现在以Java
9实现的JDK-8142936问题添加了以下方法来访问的每个部分Duration

  • toDaysPart
  • toHoursPart
  • toMinutesPart
  • toSecondsPart
  • toMillisPart
  • toNanosPart


 类似资料:
  • 对于Java8及更高版本中新的JSR 310 date API(Java.time包)中的类,javadoc表示: 那么,从duration对象中提取分钟和小时的推荐方法是什么?我们必须自己从秒数来计算吗?为什么要这样实施?

  • 问题内容: 如何在PHP中计算两个日期时间之间的分钟差? 问题答案: 从过去的一减去最近的一并除以60。 时间以Unix格式完成,因此它们只是一个很大的数字,显示从

  • 在ISO 8601中,持续时间的格式为PT5M(5分钟)或PT2H5M(2小时5分钟)。我有一个JSON文件,其中包含这种格式的值。我想知道spark是否可以提取分钟的持续时间。我尝试将其读取为“DateType”,并使用“minutes”函数获取分钟数,结果返回空值。 示例json 目前,我正在将其作为字符串读取并使用“regex_extract”函数。我想知道一种更有效的方法。 https:/

  • 问题内容: 如果我有两个这样的日期时间: 如何以以下格式获取这些日期时间之间的差异: 我用 但是我只有时间。 问题答案: 试试这个- 询问: 输出:

  • 在我的Rails应用程序中,我有一个名为Schedule的表,其中的字段称为到达,我输入了时间,我猜由于某种原因,它默认以以下格式存储在UTC中 在我的控制器中,当我做时间之类的事情时。现在,我将得到这样的时间 我的问题是需要得到两个时间在同一个区域或什么的,这样我就可以计算差异。 我知道我可以增加4个小时的时间。现在,将其设为utc,但如何在几分钟内获得它们之间的差异?我想到了一个愚蠢的黑客,如

  • 我试图创建一个基于时间的倒计时钟。它不是基于current_dates。将被拉取的初始时间将来自一个单独的php文件。这将是一个基于浏览器的游戏。当有人点击按钮来启动这个脚本。它将检查是否满足某些要求,如果满足,那么这个脚本将启动。根据对象的级别,它将拉动该进行中级别的初始计时器。希望这有意义。无论如何,我基于我提供的第一个代码的计时器脚本。 此脚本仅占分钟和秒。我对它进行了修改,使其也包括了天和