#18 Scalaで学ぶ日付と時刻の扱いの基本
Scalaの日付操作は、JVM言語らしくJavaの`java.time`パッケージをそのまま利用できます。この記事では、Scalaにおける日付の基本的な扱い方を解説します。
LocalDateTimeを使う
import java.time.LocalDateTime
val now = LocalDateTime.now()
println(now)
日付だけを扱いたい場合は`LocalDate`、時刻だけを扱いたい場合は`LocalTime`というクラスも用意されています。用途に応じて使い分けましょう。
日付を文字列にする
import java.time.format.DateTimeFormatter
val formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日")
println(now.format(formatter))
`ofPattern`に渡す書式指定子は、Javaや他のJVM言語と共通の記法です。`yyyy`は年、`MM`は月、`dd`は日を表します。
文字列から日付に変換する
逆に文字列を`LocalDateTime`に変換したい場合は、同じ`DateTimeFormatter`を`parse`メソッドと組み合わせて使います。
val parser = DateTimeFormatter.ofPattern("yyyy-MM-dd")
val date = java.time.LocalDate.parse("2026-08-20", parser)
println(date)
変換できない形式の文字列を渡すと`DateTimeParseException`が発生するため、外部からの入力を扱う場合はScalaらしく`Try`で包んでエラーを扱うことも多くあります。
日付を計算する
val threeDaysLater = now.plusDays(3)
val oneMonthAgo = now.minusMonths(1)
`plusDays`・`minusMonths`のように、加算・減算それぞれのメソッドが単位ごとに用意されています。うるう年や月末日をまたぐ計算も自動的に正しく処理してくれます。
2つの日付の差を求める
import java.time.temporal.ChronoUnit
val days = ChronoUnit.DAYS.between(startDate, endDate)
println(days)
`ChronoUnit`に単位(`DAYS`・`HOURS`など)を指定することで、2つの日時の差を柔軟に取得できます。
Scalaならではの注意点
Scalaでは、Javaの`java.time`をより関数型らしく扱える`squants`のようなライブラリも利用されることがあります。基本はJavaと共通する部分を押さえつつ、プロジェクトの方針に応じて専用ライブラリの採用も検討されます。また、`LocalDateTime`はタイムゾーンの情報を持たない点にも注意が必要です。サーバーが異なるタイムゾーンで動く可能性がある場合は、タイムゾーン付きの`ZonedDateTime`を使うことで、意図しない時刻のズレを防げます。
まとめ
Scalaの日付操作はJavaの`java.time`がそのまま使えます。文字列との相互変換や差分計算にはそれぞれ専用のクラス・メソッドを使い、タイムゾーンを扱う場合は`ZonedDateTime`も検討しましょう。関数型らしい扱いをしたい場合は専用ライブラリも視野に入れましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
Scalaをもっと学びたい方には「実践Scala入門」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿