在 Scala 中处理日期和时间的标准方法是什么?我应该使用 Java 类型还是有原生的 Scala 替代品?

在 Scala 中处理日期和时间的标准方法是什么?我应该使用 Java.util 这样的 Java 类型吗。还是有原生的 Scala 替代品?

106785 次浏览

从 JavaSE 8开始,用户被要求迁移到 Java.time (JSR-310)。有人努力为 scala (如 Scala 时间)创建包装 java.time 的 scala 库。如果目标低于 SE8使用下列之一。请参阅 为什么 JSR-310不是 Joda-Time

Awesome Scala 列出了许多流行的 Scala DateTime apis


一个新的用于 Joda Time 的 Scala 包装器。这个项目由 scala 时间分叉而来,因为似乎不再维护 scala 时间。

import com.github.nscala_time.time.Imports._


DateTime.now // returns org.joda.time.DateTime = 2009-04-27T13:25:42.659-07:00


DateTime.now.hour(2).minute(45).second(10) // returns org.joda.time.DateTime = 2009-04-27T02:45:10.313-07:00


DateTime.now + 2.months // returns org.joda.time.DateTime = 2009-06-27T13:25:59.195-07:00


DateTime.nextMonth < DateTime.now + 2.months // returns Boolean = true


DateTime.now to DateTime.tomorrow  // return org.joda.time.Interval = > 2009-04-27T13:47:14.840/2009-04-28T13:47:14.840


(DateTime.now to DateTime.nextSecond).millis // returns Long = 1000


2.hours + 45.minutes + 10.seconds
// returns com.github.nscala_time.time.DurationBuilder
// (can be used as a Duration or as a Period)


(2.hours + 45.minutes + 10.seconds).millis
// returns Long = 9910000


2.months + 3.days
// returns Period

Joda Time 是一个很好的 Java 库,在 豪尔赫 · 奥尔蒂斯创建的 Scala 时间上有一个可用于 Joda Time 的 Scala 包装器/隐式转换库。(注意隐含的性能会受到影响,但这取决于您是否会注意到。如果遇到性能问题,可以恢复到 Joda 接口)

自述:

USAGE:
import org.scala_tools.time.Imports._


DateTime.now
// returns org.joda.time.DateTime = 2009-04-27T13:25:42.659-07:00


DateTime.now.hour(2).minute(45).second(10)
// returns org.joda.time.DateTime = 2009-04-27T02:45:10.313-07:00


DateTime.now + 2.months
// returns org.joda.time.DateTime = 2009-06-27T13:25:59.195-07:00


DateTime.nextMonth < DateTime.now + 2.months
// returns Boolean = true
DateTime.now to DateTime.tomorrow
// return org.joda.time.Interval =
//   2009-04-27T13:47:14.840/2009-04-28T13:47:14.840


(DateTime.now to DateTime.nextSecond).millis
// returns Long = 1000
    

2.hours + 45.minutes + 10.seconds
// returns org.scala_tools.time.DurationBuilder
// (can be used as a Duration or as a Period)
    

(2.hours + 45.minutes + 10.seconds).millis
// returns Long = 9910000
    

2.months + 3.days
// returns Period

动机:

Java 日期和日历库在很大程度上是不够的。它们是可变的, 线程不安全,使用起来非常不方便。

Joda Time 库是 Java 日期和日历的一个很好的替代品 它们在默认情况下是不可变的,具有更丰富和更好的 API,并且 可以很容易地转换为 Java 的日期和日历类时,必要的。

这个项目为 Joda Time 提供了一层方便 类库,使它们在 Scala 中使用起来更加惯用。

(抄自 https://github.com/jorgeortiz85/scala-time)

每个人都使用 JodaTime,这些 Scala 助手/包装器库可能需要用新版本的 Scala 重新编译。Jodatime 是唯一一个已经存在很长时间的时间库,它是稳定的,并且可以可靠地与每个版本的 Scala 一起工作。

如果您使用的是 Java8,那么就没有必要再使用 nscala了。Joda-Time 库已经在 java.time包(JSR-310)下移动到 Java8中。只需将该包导入到 Scala 项目中即可。

在 Scala 中没有使用 标准处理日期的方法:

  1. 使用 Java.time (如果您正在使用 Java8) ,因为它内置了最好的 JODA 时间。没有暗示。
  2. 使用 nscala 时间。
  3. 南丫岛日期图书馆(现场较新的图书馆)

我会避免使用 java.util.Date,因为它有很好的文档说明。