Scalaでの日付と時刻の操作
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の一部でした。 すべてのクラスは、デフォルトで不変でスレッドセーフになるように設計されています。
日付文字列を解析して曜日を取得する方法を見てみましょう。
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のにあります。