4
4

More than 5 years have passed since last update.

Scala:joda-timeで一日・末日を計算して求めたい

Last updated at Posted at 2015-03-10

joda-timeなら、withMinimumValuewithMaximumValueを使うことで簡単に、一日や末日を求めることができます。

import org.scalatest._

class MySuite extends FunSuite {
  test("一日、末日の求め方") {
    import org.joda.time._

    val now = new DateTime()

    val 一日 = now.dayOfMonth().withMinimumValue()
    val 末日 = now.dayOfMonth().withMaximumValue()

    println(now.toString("yyyy-MM-dd")) // 2015-03-10
    println(一日.toString("yyyy-MM-dd")) // 2015-03-01
    println(末日.toString("yyyy-MM-dd")) // 2015-03-31
  }
}

時・分・秒まで含めて求める例

時・分・秒で1ヶ月の期間を計算する場合の例です。時・分・秒でも、withMinimumValuewithMaximumValueを使って最小値・最大値に変換することで、一日・末日を求めることが出来ます。

import org.scalatest._

class MySuite extends FunSuite {
  test("一日、末日の求め方") {
    import org.joda.time._

    val now = new DateTime()

    val 一日 = now.dayOfMonth().withMinimumValue().hourOfDay().withMinimumValue().minuteOfHour().withMinimumValue().secondOfMinute().withMinimumValue().millisOfSecond().withMinimumValue()
    val 末日 = now.dayOfMonth().withMaximumValue().hourOfDay().withMaximumValue().minuteOfHour().withMaximumValue().secondOfMinute().withMaximumValue().millisOfSecond().withMaximumValue()

    println(一日, 末日) // (2015-03-01T00:00:00.000Z,2015-03-31T23:59:59.999Z)
  }
}

タイムゾーンを考慮して時・分・秒まで求める例

DBにはUTCで記録されているが、ユーザは日本時間といった場合、ユーザからの入力は日本時間で解釈しつつ、DBにはUTCの時刻で問い合わせる場合があります。その場合は、LocalDateTimeでユーザ入力を受け付け、日本時間のDateTimeオブジェクトに変換し、一日・末日を求めた後、DBにクエリする際に、UTCのDateTimeオブジェクトに変換するという流れになると思います。LocalDateTimeはタイムゾーン情報を持たないオブジェクトです。

import org.scalatest._

class MySuite extends FunSuite {
  test("一日、末日の求め方") {
    import org.joda.time._

    val `Asia/Tokyo` = DateTimeZone.forID("Asia/Tokyo")
    val UTC = DateTimeZone.forID("UTC")

    val now = new LocalDateTime("2015-03-31T15:00:00").toDateTime(`Asia/Tokyo`)

    val 一日 = now.dayOfMonth().withMinimumValue().hourOfDay().withMinimumValue().minuteOfHour().withMinimumValue().secondOfMinute().withMinimumValue().millisOfSecond().withMinimumValue()
    val 末日 = now.dayOfMonth().withMaximumValue().hourOfDay().withMaximumValue().minuteOfHour().withMaximumValue().secondOfMinute().withMaximumValue().millisOfSecond().withMaximumValue()

    println(一日) // 2015-03-01T00:00:00.000+09:00
    println(末日) // 2015-03-31T23:59:59.999+09:00
    println(一日.withZone(UTC)) // 2015-02-28T15:00:00.000Z
    println(末日.withZone(UTC)) // 2015-03-31T14:59:59.999Z
  }
}
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4