1. 概要

このチュートリアルでは、Scalaで日付と時刻を操作するオプションについて説明します。 次に、関連する例を使用して、各アプローチの長所と短所を確認します。

2. Scalaの日付と時刻

ScalaはJVMベースの言語であるため、JDKJavaライブラリのすべての長所と問題をもたらします。 人気と機能性に基づいて、最も重要なものをいくつか見ていきます。

ネイティブ日時ライブラリはScalaでは利用できないことに注意してください。 ただし、Scalaには便利なヘルパーライブラリがいくつかあります。

3. Scalaライブラリ

私たちが利用できるJavaライブラリはたくさんあります。 しかし、残念ながら、これらのオプションはどれも、Scalaで日時計算を書くための慣用的な方法を提供しません。 これは、Joda-Timeなどの人気のあるJavaライブラリの周りの特定のラッパーライブラリの起源を動機付けました。

これらのライブラリは、基盤となるJavaライブラリの能力とScalaの表現力豊かなコーディングスタイルの優雅さを兼ね備えています。

3.1. Scala-TimeとNscala-Time

Scala-Timeとその新しいバージョンであるNscala-Timeは、Joda-Timeのラッパーライブラリです。 これらのラッパーは、コードの表現力を改善するためにいくつかのインプラントを提供します。 また、は日時算術の演算子を提供します。

長時間実行されるプロセスの経過時間を計算する簡単な例を見てみましょう。

val processStart:DateTime = DateTime.now()
val processEnd:DateTime = processStart + (1.hours + 10.minutes + 5.seconds)
val elapsed:Interval = processStart to processEnd
println(elapsed.toPeriod.toString(PeriodFormat.getDefault))   // Prints "1 hour, 10 minutes and 5 seconds"

4. Javaライブラリ

4.1. Java-Time

Java 8リリースの一部として、Java-Timeと呼ばれる新しい包括的な日時ライブラリがJDKに導入されました。 これはProjectThreeTenの一部でした。 すべてのクラスは、デフォルトで不変でスレッドセーフになるように設計されています

APIの設計は、Joda-Timeに触発されています。 その結果、すべての Joda-Timeの機能はJava-Timeでも利用できます。 これにより、開発者はJoda-TimeからJava-Timeにスムーズに移行できます。

日付文字列を解析して曜日を取得する方法を見てみましょう。

val dateStr = "2021-06-13"
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
val localDate = LocalDate.parse(dateStr, formatter)
println(localDate.getDayOfWeek) // prints "SUNDAY"

4.2. ジョーダタイム

JDKの標準の日時クラスの問題により、他の多くのサードパーティライブラリが作成されました。 Joda-Timeはその中で最も人気があります不変性はデフォルトでライブラリに組み込まれています。複数のカレンダーシステム、タイムゾーンのサポート、解析など、他の多くの機能も提供します。

Joda-Timeには非常に安定したAPIがあり、問題はほとんど報告されていません。 その高い信頼性と信頼性により、日時計算に最適なライブラリになりました。

Joda-Timeを使用して日付文字列を解析し、曜日の値を取得してみましょう。

val dateStr = "2021-06-13"
val formatter = DateTimeFormat.forPattern("yyyy-MM-dd")
val dateTime:DateTime = formatter.parseDateTime(dateStr)
println(dateTime.dayOfWeek().getAsText(Locale.getDefault()))  // Prints "Sunday"

4.3. java.util.Dateおよび関連ライブラリ

java.util.Date は、バージョン1.8までのJDKで使用可能なデフォルトの日時ライブラリです。 しかし、いくつかの問題により、開発者から多くの批判が寄せられています。

これらのうち、の主なものは、オブジェクトが可変であり、スレッドセーフではないことです。 その欠点に関係なく、多くのレガシーアプリケーションでの使用を見ることができます。 これらの問題を回避し、このライブラリを安全に使用する方法はたくさんあります。

5. 結論

この短いチュートリアルでは、Scalaで日時値を操作するためのさまざまなオプションを評価しました。 まず、java.util.Dateの使用に関する制限を確認しました。 その後、新しいjava.timeライブラリを使用する利点を確認しました。

最後に、Joda-TimeライブラリとそのScalaラッパーnscala-timeを調べました。 結論として、新しいプロジェクトでは、慣用的なScalaスタイルのコーディングを好む場合は、nscala-timeを選択できます。 それ以外の場合、オーバーヘッドを減らして高性能を必要とする場合は、java.timeを選択します

いつものように、完全なソースコードはGitHubにあります。