joda-timeなら、withMinimumValue
やwithMaximumValue
を使うことで簡単に、一日や末日を求めることができます。
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ヶ月の期間を計算する場合の例です。時・分・秒でも、withMinimumValue
やwithMaximumValue
を使って最小値・最大値に変換することで、一日・末日を求めることが出来ます。
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
}
}