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を指定している場合は注意する必要がある。
参考
- Exposed - wiki
- ZoneDateTime support · Issue #950 · JetBrains/Exposed · GitHub
- Postgresql timestamp with tomezone · Issue #221 · JetBrains/Exposed · GitHub
- Should LocalDate be stored by default in UTC? · Issue #886 · JetBrains/Exposed · GitHub
- Exposed/JavaDateColumnType.kt at master · JetBrains/Exposed · GitHub