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


161

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

Answers:


129

从Java SE 8开始,要求用户迁移到java.time(JSR-310)。正在努力创建将java.time打包为scala的scala库,例如scala-time。如果定位低于SE 8,请使用以下选项之一。另请参见为什么JSR-310不是Joda-Time


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-time的 Joda Time 。(请注意,隐式会影响性能,但是如果您会注意到,则取决于您的操作。如果遇到性能问题,您可以恢复为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

4
视频scalaj:Java库的惯用
oluies 2010年

谢谢,我不知道这个包装。
Vadim Shender

我无法从中获取格式化输出。如果我使用DateTime.formatted(“ yyyyMMdd”)我只是得到普通的“ yyyyMMdd”(字母没有被相应的数字代替)作为响应。如果我使用DateTime.formatted(DateTimeFormat.forPattern(“ yyyyMMdd”))-我收到要求输入字符串参数的错误。
伊万

1
由于似乎不再保留scala-time,因此已被nscala-time取代(与scala 2.10的scala-time相反)。可以在github.com/nscala-time/nscala-time找到。
塞巴斯蒂安·甘斯兰德

1
无法解决与Imports和有关的问题scala.concurrent.duration._。改用普通的JodaTime,并在上面写了自己的自行车。
kisileno 2014年

12

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


1
那是不对的。切换到Java-8 =>两个不同的API时,必须迁移/调整Joda-Time-code!
Meno Hochschild

7

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

  1. 使用java.time(如果使用的是Java 8),因为它内置了最佳的JODA时间。没有隐式。
  2. 使用nscala时间。
  3. 南丫岛日期资料库(相对而言是新的资料库)

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


5

动机:

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

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

该项目为Joda Time库提供了一个方便的薄层,使它们在Scala中更惯用。

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


3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.