Kotlinで日付と時間を扱う: java.time vs. Joda-Time

目次

  1. はじめに
  2. java.time APIの概要
  3. Joda-Timeの概要
  4. java.timeとJoda-Timeの比較
  5. 結論

はじめに

日付と時間の操作は、多くのアプリケーションで不可欠な要素です。Kotlinでは、主にjava.timeパッケージとJoda-Timeライブラリの二つの選択肢があります。本記事では、これらのAPIの特徴と使い方を紹介し、その違いを比較します。

java.time APIの概要

java.timeJava 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タイムゾーンを含む日付と時間を表現し、OffsetDateTimeUTCからのオフセットを表します。

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-Timejava.timeが導入される前に広く使用されていたサードパーティ製のライブラリです。

DateTime, LocalDate, LocalTime

Joda-Timeでも、DateTimeLocalDateLocalTimeなどが用意されています。

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のPeriodDurationjava.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.timeJava標準であり、今後も長期間サポートされることが保証されています。一方、Joda-Timeはすでにメンテナンスモードにあり、新機能の追加は行われていません。

結論

java.timeはKotlinでの日付と時間の操作において、最も推奨される選択肢です。Joda-Timeは歴史的な理由から使用されることがありますが、今後はjava.timeに移行することを検討すべきです。