目次
はじめに
日付と時間の操作は、多くのアプリケーションで不可欠な要素です。Kotlinでは、主にjava.time
パッケージとJoda-Time
ライブラリの二つの選択肢があります。本記事では、これらのAPIの特徴と使い方を紹介し、その違いを比較します。
java.time APIの概要
java.time
はJava 8で導入された日付と時間を扱う標準ライブラリです。このパッケージはJSR-310
によって規定されており、モダンなAPI設計が特徴です。
LocalDate, LocalTime, LocalDateTime
LocalDate
は日付のみを、LocalTime
は時間のみを、LocalDateTime
はその両方を扱います。
import java.time.LocalDate import java.time.LocalTime import java.time.LocalDateTime fun main() { val date = LocalDate.now() val time = LocalTime.now() val dateTime = LocalDateTime.now() println("Current date: $date") println("Current time: $time") println("Current date and time: $dateTime") }
ZonedDateTimeとOffsetDateTime
ZonedDateTime
はタイムゾーンを含む日付と時間を表現し、OffsetDateTime
はUTCからのオフセットを表します。
import java.time.ZonedDateTime import java.time.OffsetDateTime fun main() { val zonedDateTime = ZonedDateTime.now() val offsetDateTime = OffsetDateTime.now() println("Current ZonedDateTime: $zonedDateTime") println("Current OffsetDateTime: $offsetDateTime") }
PeriodとDuration
Period
は日、月、年の単位で時間の間隔を表し、Duration
は秒およびナノ秒の単位で時間の間隔を表します。
import java.time.Duration import java.time.Period import java.time.LocalDate import java.time.LocalDateTime fun main() { val period = Period.ofDays(10) val duration = Duration.ofHours(5) val futureDate = LocalDate.now().plus(period) val futureDateTime = LocalDateTime.now().plus(duration) println("10 days later: $futureDate") println("5 hours later: $futureDateTime") }
DateTimeFormatter
DateTimeFormatter
は日付と時間をフォーマットするためのクラスです。カスタムフォーマットも可能です。
import java.time.LocalDateTime import java.time.format.DateTimeFormatter fun main() { val dateTime = LocalDateTime.now() val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") val formattedDateTime = dateTime.format(formatter) println("Formatted DateTime: $formattedDateTime") }
Joda-Timeの概要
Joda-Time
はjava.time
が導入される前に広く使用されていたサードパーティ製のライブラリです。
DateTime, LocalDate, LocalTime
Joda-Timeでも、DateTime
、LocalDate
、LocalTime
などが用意されています。
import org.joda.time.DateTime import org.joda.time.LocalDate import org.joda.time.LocalTime fun main() { val dateTime = DateTime.now() val localDate = LocalDate.now() val localTime = LocalTime.now() println("Current DateTime: $dateTime") println("Current LocalDate: $localDate") println("Current LocalTime: $localTime") }
PeriodとDuration (Joda-Time)
Joda-TimeのPeriod
とDuration
はjava.timeのものと似ていますが、APIが異なります。
import org.joda.time.Period import org.joda.time.Duration import org.joda.time.LocalDate fun main() { val period = Period.days(10) val duration = Duration.standardHours(5) val futureDate = LocalDate.now().plus(period) val durationInMillis = duration.millis println("10 days later: $futureDate") println("Duration in milliseconds: $durationInMillis") }
DateTimeFormatter (Joda-Time)
Joda-TimeにもDateTimeFormatter
があり、java.time
のものとは若干異なる使い方をします。
import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat fun main() { val dateTime = DateTime.now() val formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") val formattedDateTime = dateTime.toString(formatter) println("Formatted DateTime: $formattedDateTime") }
java.timeとJoda-Timeの比較
利便性と使いやすさ
java.time
は標準ライブラリであり、追加の依存関係を必要としません。また、より直感的で簡潔なAPIを提供します。
パフォーマンス
java.time
はパフォーマンスが最適化されており、ネイティブサポートの恩恵を受けることができます。
将来性とサポート
java.time
はJava標準であり、今後も長期間サポートされることが保証されています。一方、Joda-Time
はすでにメンテナンスモードにあり、新機能の追加は行われていません。
結論
java.time
はKotlinでの日付と時間の操作において、最も推奨される選択肢です。Joda-Time
は歴史的な理由から使用されることがありますが、今後はjava.time
に移行することを検討すべきです。