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

有没有办法从一个特定的时间单位的数量中创建一个周期?

慎志国
2023-03-14

创建一个持续时间作为给定单位的给定数量是很简单的:

Duration duration = Duration.of(3, ChronoUnit.HOURS);

但是对于时期没有这样的方法。最好的方法是什么?

我的情况是,我有一个单位和一个计数作为变量,所以不能简单地硬编码对Period::ofYear或类似的调用。

这是我想到的最干净的东西:

Period period = Period.from(new TemporalAmount() {
    @Override
    public long get(TemporalUnit unitToGet) { return unitToGet.equals(unit) ? amount : 0; }

    @Override
    public List<TemporalUnit> getUnits() { return List.of(unit); }

    @Override
    public Temporal addTo(Temporal temporal) { throw new UnsupportedOperationException(); }

    @Override
    public Temporal subtractFrom(Temporal temporal) { throw new UnsupportedOperationException(); }
});

这是干净的,因为它避免了嵌入关于一个时期可以有什么单位的知识,尽管这可能过于纯粹。不过,对于这样一个简单的操作来说,它似乎太冗长了!

共有1个答案

宇文弘懿
2023-03-14

问题是,Period不支持所有的时间单位,因此通用方法不适用于这里。它可以模拟,但只能相对于特定日期:

LocalDate base = LocalDate.of(2000, 1, 1);
LocalDate added = base.plus(amount, unit);
Period period = Period.between(base, added);

确保你考虑可变长度的月份和2月29日会发生什么,因为这种方法可能没有你想要的行为。

 类似资料:
  • 我对Clojure和函数式编程很陌生,我试图使用两个函数将一些字符连接到一个字符串中。我的想法基本上是这样的: 因此,我的想法是从函数send开始,并作为参数编写一个字符列表,如下所示: 带有get sent的receive函数一次发送一个字符,并使用str将它们添加到一起,我的最终输出是:“hello”。 当我尝试运行代码时,会出现以下错误:automata处的执行错误(ClassCastExc

  • 我想知道是否有任何本机的方法可以在预定的时间内“平滑滚动”。 为了举例说明我的问题,我希望一个高度为10000dp的垂直从底部滚动到顶部,滚动的时间与它从中部(5000dp)滚动到顶部的时间相同。 如果可以使用插值器,那就太棒了:) 找不到与

  • 如果您下载了目录,Google 云端硬盘网络界面允许您下载单个.zip文件。但是,我发现没有办法使用API做到这一点。是否可以使用 API 在驱动器上创建多文件 zip? 更新:田木的代码有效!这太棒了!但是,我只能在我的个人帐户中使用它。我有两个 G Suite 管理员帐号,但出现以下错误消息: “抱歉,此时无法打开文件。 请检查地址,然后重试。” 我已经确认这可以在多个免费的个人google帐

  • 我试着检测一个整音符和一个半音符,但对于半音符,我似乎检测不出来,因为它是一个镂空的圆圈。有没有办法检测出镂空的圆圈? 下面是我的代码:

  • 问题内容: 根据MDN 文档: 该 方法冻结对象:即,防止向其添加新属性;防止现有属性被删除;并防止更改现有属性或其可枚举性,可配置性或可写性。本质上,对象实际上是不可变的。该方法返回被冻结的对象。 我期望在某个日期调用冻结会阻止对该日期进行更改,但是它似乎没有用。这是我正在做的(运行Node.js v5.3.0): 我本以为调用会失败或什么都不做。任何想法如何冻结日期? 问题答案: 有没有办法O

  • 例如,分区有1-10的偏移量。我只想从3-8消费。在消耗了第8条消息后,程序应该退出。