166

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

4

5 回答 5

133

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

Awesome scala列出了许多流行的 Scala DateTime api


Joda Time 的新 Scala 包装器。这个项目是从 scala-time 派生出来的,因为 scala-time 似乎不再维护。

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 库, Jorge Ortiz创建的Scala时间有一个 Scala 包装器/隐式转换库可供 Joda Time使用。(注意implicits 会影响性能,但这取决于您是否会注意到您所做的事情。如果遇到性能问题,您可以恢复到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
于 2010-09-01T01:33:26.237 回答
13

如果您使用的是 Java 8,则无需再使用nscala。Joda-Time 库已移至java.time包 (JSR-310) 下的 Java 8 中。只需将该包导入您的 Scala 项目即可。

于 2015-02-04T20:30:49.573 回答
8

Scala中没有处理日期的标准方法。可用的选项有:

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

由于围绕它的有据可查的问题,我会避免使用 java.util.Date。

于 2015-04-02T23:22:05.950 回答
5

动机:

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

Joda Time 库是 Java 的 Date 和 Calendar 类的绝佳替代品。默认情况下它们是不可变的,具有更丰富和更好的 API,并且可以在必要时轻松转换为 Java 的 Date 和 Calendar 类。

这个项目为 Joda Time 库提供了一层薄薄的便利,使它们在 Scala 中使用起来更加地道。

(从https://github.com/jorgeortiz85/scala-time复制)

于 2013-01-08T14:15:56.190 回答
3

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

于 2013-07-15T21:20:10.463 回答