【问题标题】:subtracting a DateTime from a DateTime in scala从 scala 中的 DateTime 中减去 DateTime
【发布时间】:2011-05-15 10:48:09
【问题描述】:

我对 scala 和 jodatime 都比较陌生,但对两者都印象深刻。我试图弄清楚是否有更优雅的方法来做一些日期算术。这是一个方法:


private def calcDuration() : String = {
  val p = new Period(calcCloseTime.toInstant.getMillis - calcOpenTime.toInstant.getMillis)
  val s : String = p.getHours.toString + ":" + p.getMinutes.toString + 
      ":" + p.getSeconds.toString
  return s
}

我将所有内容都转换为字符串,因为我将其放入 MongoDB,但我不确定如何序列化 joda Duration 或 Period。如果有人知道我会非常感激答案。

无论如何,calcCloseTime 和 calcOpenTime 方法返回 DateTime 对象。将它们转换为 Instant 是我发现获得差异的最佳方式。有没有更好的办法?

另一个问题:当小时、分钟或秒是个位数时,结果字符串不是零填充的。有没有一种简单的方法可以使该字符串看起来像 HH:MM:SS?

谢谢, 约翰

【问题讨论】:

    标签: scala jodatime


    【解决方案1】:

    Period 格式化由 PeriodFormatter 类完成。您可以使用默认的,或使用PeriodFormatterBuilder 构建您自己的。您可能需要更多代码才能正确设置此构建器,但您可以像这样使用它:

    
    scala> import org.joda.time._
    import org.joda.time._
    
    scala> import org.joda.time.format._
    import org.joda.time.format._
    
    scala> val d1 = new DateTime(2010,1,1,10,5,1,0)
    d1: org.joda.time.DateTime = 2010-01-01T10:05:01.000+01:00
    
    scala> val d2 = new DateTime(2010,1,1,13,7,2,0)
    d2: org.joda.time.DateTime = 2010-01-01T13:07:02.000+01:00
    
    scala> val p = new Period(d1, d2)
    p: org.joda.time.Period = PT3H2M1S
    
    scala> val hms = new PeriodFormatterBuilder() minimumPrintedDigits(2) printZeroAlways() appendHours() appendSeparator(":") appendMinutes() appendSuffix(":") appendSeconds() toFormatter
    hms: org.joda.time.format.PeriodFormatter = org.joda.time.format.PeriodFormatter@4d2125
    
    scala> hms print p
    res0: java.lang.String = 03:02:01
    

    您也许还应该注意,不考虑日间转换:

    
    scala> val p2 = new Period(new LocalDate(2010,1,1), new LocalDate(2010,1,2))
    p2: org.joda.time.Period = P1D
    
    scala> hms print p2                                                         
    res1: java.lang.String = 00:00:00
    

    因此,如果您还需要处理这些,您还需要在格式化程序中添加必填字段(可能是天、周、年)。

    【讨论】:

    • 效果很好,但在 toFormatter 末尾需要括号:... appendSeconds() toFormatter()
    【解决方案2】:

    您可能想查看 Jorge Ortiz 的 Joda-Time 包装器 scala-time,以了解在 Scala 中使用起来更好的东西。

    你应该可以使用类似的东西

    (calcOpenTime to calcCloseTime).millis
    

    【讨论】:

    • 谢谢 Jon,我会研究一下包装。
    【解决方案3】:

    this link 有帮助吗?

    如何计算两个日期之间的差异?

    这个问题有不止一个答案!如果您只想要两个日期之间的整天数,那么您可以使用 Joda-Time 1.4 版中的新 Days 类。

    Days d = Days.daysBetween(startDate, endDate);
    int days = d.getDays();
    

    此方法和 Days 类中的其他静态方法都设计为与 JDK5 静态导入工具配合使用。

    但是,如果您想计算两个日期之间的天数、周数、月数和年数,那么您需要一个 Period 默认情况下,这会将两个日期时间之间的差异分成几部分,例如“1 个月, 2 周 4 天 7 小时”。

    Period p = new Period(startDate, endDate);
    

    您可以控制使用 PeriodType 提取哪些字段。

    Period p = new Period(startDate, endDate, PeriodType.yearMonthDay());
    

    此示例将返回不返回任何周或时间字段,因此上一个示例变为“1 个月零 18 天”。

    【讨论】:

    • 请反转答案,因为该链接中的有用信息已粘贴在答案中。无需去源头,但你可以在最后引用它。 (我试图编辑你的答案,但我得到了一些编辑队列已满:S)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多