Scalaで日付と時刻を処理する標準的な方法は何ですか?Javaの型を使用する必要がありますか、それともネイティブのScala代替がありますか?


161

Scalaで日付と時刻を処理する標準的な方法は何ですか?java.util.DateなどのJavaの型を使用する必要がありますか、それともネイティブのScala代替がありますか?

回答:


129

Java SE 8以降、ユーザーはjava.time(JSR-310)への移行を求められます。scala-timeなど、java.timeをscala用にラップするscalaライブラリーを作成する取り組みがあります。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-timeでJoda Timeに利用できるScalaラッパー/暗黙の変換ライブラリがあります。(暗黙的にパフォーマンスに影響があることに注意してください。ただし、気づくかどうかによって異なります。パフォーマンスの問題が発生した場合は、Jodaインターフェースに戻すことができます)

READMEから:

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

ありがとう、このラッパーについては知りません。
Vadim Shender、2010

これからフォーマットされた出力を取得できません。DateTime.formatted( "yyyyMMdd")を使用する場合、応答としてプレーンな "yyyyMMdd"(対応する数字で置き換えられていない文字)を取得します。DateTime.formatted(DateTimeFormat.forPattern( "yyyyMMdd"))を使用する場合-文字列引数を要求するエラーが発生します。
Ivan

1
scala-timeはもはや維持されていないようなので、nscala-timeに置き換えられました(これは、scala-timeがscala 2.10で動作するのとは対照的です)。それはで見つけることができgithub.com/nscala-time/nscala-time
Sebastian Ganslandt 2013年

1
自分で問題を把握することはできませんImportsscala.concurrent.duration._。代わりに単純なJodaTimeを使用し、その上に自分の自転車を書きました。
kisileno 2014

12

Java 8を使用している場合は、nscalaもう使用する必要はありません。Joda-Timeライブラリは、java.timeパッケージ(JSR-310)の下でJava 8に移動されました。そのパッケージをScalaプロジェクトにインポートするだけです。


1
それは真実ではありません。Joda-Time-codeは、Java-8に切り替えるときに移行/調整する必要があります=> 2つの異なるAPI!
Meno Hochschild 2017年

7

Scalaで日付を処理する標準的な方法はありません。利用可能なオプションは次のとおりです。

  1. java.timeを使用します(Java 8を使用している場合)。これには、最高のJODA時間が組み込まれているためです。暗黙的ではありません。
  2. nscala-timeを使用します。
  3. ラマ日付ライブラリー(比較的新しいシーンのライブラリー)

十分に文書化された問題を含むため、java.util.Dateの使用は避けます。


5

動機:

Javaの日付およびカレンダーライブラリは、主に不十分です。これらは変更可能であり、スレッドセーフではなく、使用するのは非常に不便です。

Joda Timeライブラリは、Javaの日付クラスとカレンダークラスの優れた代替品です。これらはデフォルトで不変であり、はるかに豊富で優れたAPIを備えており、必要に応じてJavaの日付クラスとカレンダークラスに簡単に変換できます。

このプロジェクトは、Joda Timeライブラリーに便利な薄層を提供し、Scala内で使用するための慣用的なものにします。

https://github.com/jorgeortiz85/scala-timeからコピー)


3

誰もがJodaTimeを使用しています。これらのScalaヘルパー/ラッパーライブラリは、新しいバージョンのScalaで再コンパイルする必要がある場合があります。Jodatimeは、長い間使用されてきた唯一のタイムライブラリであり、Scalaのすべてのバージョンで安定して動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.