Iganinのブログ

日頃の開発で学んだ知見を中心に記事を書いています。

【Kotlin】ExposedでDateTimeを扱う

TL;DR;

  • org.jetbrains.exposed:exposed-java-timeを使う
  • timezone付きでの保存には対応してないため注意
  • localDate, localDateTimeへの変換の際にsystemDefault TimeZoneが使用されるため注意

環境

  • Exposed 0.23.1

内容

ExposedはKtorとともに主に使用されるKotlin製のORMである。 TransactionalなデータのテーブルにはデータのCRUD処理に伴うcreateされた時刻や、updateされた時刻などを基本的には保存しておきたい。 Exposedで該当の処理を行おうとした場合、そのままではできず、 exposed-java-time を使用する必要がある。

exposed-java-timeをbuild.gradleのdependenciesに追加し、Daoで使用することができる。

dependencies {
    ~~~
    // build.gradleのdependenciesに下記を追加
    implementation "org.jetbrains.exposed:exposed-java-time:$exposed_version"
    ~~~
}
import org.jetbrains.exposed.dao.id.LongIdTable
import org.jetbrains.exposed.sql.`java-time`.date
import org.jetbrains.exposed.sql.`java-time`.datetime

object SampleDao : LongIdTable("samples") {
  val name = varchar("name", 255)
  val date = date("date")
  val createdAt = datetime("created_at")
  val updatedAt = datetime("update_at")
}

注意点は2つ。

DBのtimestamp with timezoneをサポートしていない。また、OffsetDateTimeやZonedDateTimeのサポートはない。 DBにtimezone付きの時刻を保存できない以上、コード側でtimezoneをUTCに変換しDBとやり取りするしかないと思う。

DBのColumnからlocalDateやlocalDateTimeを生成する際にTimeZoneとしてsystemDefaultが使用される。 そのため、DockerなどでTimeZoneを指定している場合は注意する必要がある。

参考