【问题标题】:Joda-Time all in minutesJoda-时间都在几分钟内
【发布时间】:2012-01-09 18:45:10
【问题描述】:

有没有一种隐藏的方法可以在几分钟内(或任何其他时间)获得Joda-Time 期间

我现在这样做:

(period.getHours()*60 + period.getMinutes() + roundTwoDecimals((double)(period.getSeconds()/60)))
double roundTwoDecimals(double d) {
        DecimalFormat twoDForm = new DecimalFormat("#.##");
    return Double.valueOf(twoDForm.format(d));
}

但出于某种原因,我认为可能有更简单的方法。

编辑:我的时间将是最长小时,永远不会是天。这是我第一次使用 Joda-Time。

【问题讨论】:

  • 一段时间内的分钟数取决于它与特定时刻的关联。如果这个时期跨越闰年或闰秒呢?结果值会有所不同。您可以改用Duration 吗?
  • 有关一些说明,请查看this answerthis answer
  • 感谢您的链接,即使我这次不使用持续时间,它们也提供了宝贵的知识。

标签: java jodatime


【解决方案1】:

由于Periods 是由单个组件字段(例如 5 年 7 周)定义的,因此如果不先将它们与特定时刻相关联,它们就不能(容易)直接转换为分钟值。

例如,如果您有 2 个月的时间段,它包含多少分钟?为了知道这一点,你需要知道哪两个月。也许:

  • 六月和七月? (30 + 31 = 61 天)
  • 七月和八月? (31 + 31 = 62 天)
  • 闰年的二月和三月? (29 + 31 = 60 天)

每一个都有不同的分钟数。

请记住,有几种方法可以解决这个问题。以下是一对:

  1. 如果您保证您的Period 不会包含月份(或更高),您可以使用toStandardSeconds()

    Period period = new Period(60, 40, 20, 500);
    System.out.println(period.toStandardSeconds().getSeconds() / 60.0);
    
    // outputs 3640.3333333333335
    

    但是,如果您最终在 Period 中获得月份值,您将获得(根据 javadoc)UnsupportedOperationException

    java.lang.UnsupportedOperationException: 无法转换为秒,因为此期间包含月份且月份长度不同

  2. 否则,您可以将Period 与某个瞬间关联并使用Duration

    Period period = new Period(1, 6, 2, 2, 5, 4, 3, 100);
    
    // apply the period starting right now
    Duration duration = period.toDurationFrom(new DateTime());
    
    System.out.println(duration.toStandardSeconds().getSeconds() / 60.0);
    
    // outputs 810964.05 (when right now is "2012-01-09T13:36:43.880-06:00")
    

请注意,#2 将根据代码运行的日期打印不同的值。但这就是它的本质。

作为替代方案,您可以考虑从一开始就使用Durations(如果可能的话)而不使用Periods。

【讨论】:

  • 我的程序“持续时间”只会在几分钟到几个小时之间,阅读答案似乎我应该从一开始就已经持续了。但是考虑到已经写好了,你认为方法#1 只是一个简单的解决方法吗?如果我使用 period.toStandardminutes() 最后一个问题会不会更简单?无需添加和乘以小时。
  • @Juan - #1 可能足以解决您的情况;在它周围添加一个检查数月(以避免意外的UnsupportedOperationException)可能不会有什么坏处,以防他们碰巧潜入。至于toStandardMinutes():我使用秒数是因为A)我不确定@987654338是否@ 会截断部分秒数,并且 B)如果您需要这些部分秒数。如果你对截断没问题,使用toStandardMinutes() 可能没问题。
  • @Juan - “试过...但没用” - 怎么样?您能否用您尝试过的代码、结果以及为什么不符合预期来更新您的问题?
  • 好的,工作。似乎之前的声明有一点错误。使用:roundTwoDecimals((double)(period.toStandardSeconds().getSeconds())/60) 我不得不离开roundTwoDecimals并将其转换为double,但仍然更好
  • 这个公认的答案是不必要的复杂。查看Minutes 类,如my answer 所示。简单的一行代码。
【解决方案2】:

是的,您可以轻松地从 Joda-Time Period 对象获取分钟数。

int minutes = Minutes.standardMinutesIn( period ).getMinutes();

【讨论】:

    【解决方案3】:

    您可以尝试(double) period.getMillis()/60000 并重新格式化。

    【讨论】:

    • 这只会返回周期的毫秒分量,而忽略其他字段。
    • 澄清一下,执行new Period(1, 6, 2, 2, 5, 4, 3, 100).getMillis() 只会返回100,而不是周期的完整长度(即总和字段)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多