scalaの時間操作をする方法についてメモ。
joda-timeというJavaのライブラリがあるので、それを利用する。
依存を追加
libraryDependenciesにjoda-timeを追加。さらにjoda-convertを追加しておかないと、コンパイル時にwarningsが出るので一緒に追加しておく。この辺はアノテーション周りで何かあるらしいけどまだ深追いしていない。
libraryDependencies ++= Seq( "joda-time" % "joda-time" % "2.7", "org.joda" % "joda-convert" % "1.7", )
timestampからDateTime型を作成
よくやるのがtimestampからDateTime型を作成。timestampはIntの範囲に収まるが、DateTimeを作るときのtimestampはmsecのため、Intの範囲に収まらない。このため、キャストしてあげないと正しく動作しないので注意。
import org.joda.time.DateTime val timestamp = 1437956468; val dt = new DateTime(timestamp * 1000L)
またこの時にタイムゾーンを指定する場合はこんな感じ。
import org.joda.time.DateTime import org.joda.time.DateTimeZone val timestamp = 1437956468; val dt = new DateTime(timestamp * 1000L, DateTimeZone.UTC)
DateTime型を文字列で出力する
DateTime型はDateTimeFormatを利用して様々な形式に出力できる。どんなフォーマット型があるかとか調べるのは面倒なので、DateTimeFormat.forPatternを利用した。
import org.joda.time.DateTime import org.joda.time.DateTimeZone import org.joda.time.format.DateTimeFormat val timestamp = 1437956468; val dt = new DateTime(timestamp * 1000L, DateTimeZone.UTC) val fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss") fmt.print(dt)
逆にparseしたい場合はこんな感じ。
val dt = fmt.parseDateTime("2015-07-27T00:21:08")