Slide 1

Slide 1 text

kotlinx.datetime 使ってみた Sansan モバイル勉強会 vol.1 Takuji Nishibayashi(@takuji31)

Slide 2

Slide 2 text

自己紹介 西林 拓志 (にしばやし たくじ ) Twitter/GitHub takuji31 Sansan 株式会社 2024/04/01 入社 技術本部 Mobile Application グループ 6 月〜 Eight Android チーム テックリード Android (2009〜 ) Kotlin (2014〜 ) 1

Slide 3

Slide 3 text

日付処理してますか? 2

Slide 4

Slide 4 text

Kotlin JVM や Android で日付関連クラスといえば 3

Slide 5

Slide 5 text

java.util.Date / java.util.Calendar 4

Slide 6

Slide 6 text

java.time (JSR310) 5

Slide 7

Slide 7 text

今なら java.time を使うことが多い 6

Slide 8

Slide 8 text

see. java.time を Android で使う 7

Slide 9

Slide 9 text

Kotlin Multiplatform だとどうか? 8

Slide 10

Slide 10 text

kotlinx.datetime 9

Slide 11

Slide 11 text

Kotlin Multiplatform 対応の公式ライブラリー 10

Slide 12

Slide 12 text

kotlinx.serialization 対応 11

Slide 13

Slide 13 text

JVM/JS/WASM/Native 等実装あり 12

Slide 14

Slide 14 text

github.com/Kotlin/kotlinx-datetime 13

Slide 15

Slide 15 text

kotlinx.datetime の使い方 14

Slide 16

Slide 16 text

build.gradle.kts repositories { mavenCentral() } kotlin { sourceSets { commonMain { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.0") } } } } 15

Slide 17

Slide 17 text

kotlinx.datetime のクラスたち Instant Clock LocalDateTime LocalDate LocalTime TimeZone Month DayOfWeek etc. 16

Slide 18

Slide 18 text

今回はよく使いそうなクラスだけ紹介 17

Slide 19

Slide 19 text

Instant 18

Slide 20

Slide 20 text

エポック秒を持っているクラス 19

Slide 21

Slide 21 text

いわゆる Date っぽいやつ 20

Slide 22

Slide 22 text

使い方 val now = Clock.System.now() now.epochSeconds // 1970/01/01 00:00:00からの経過秒数 now.toEpochMilliseconds() // 1970/01/01 00:00:00からの経過ミリ秒数 now.nanosecondsOfSecond // ナノ秒 val secondLater = now + 1.seconds// 1秒後 val sameTimeOfYesterday = now - 1.days // 昨日の同じ時間 21

Slide 23

Slide 23 text

LocalDateTime 22

Slide 24

Slide 24 text

タイムゾーンを含まない DateTime 23

Slide 25

Slide 25 text

LocalDate + LocalTime 24

Slide 26

Slide 26 text

使い方 val now = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()) now.year // 2024 now.month // Month.JULY now.monthNumber // 7 now.date // 10 now.hour // 12 now.minute // 34 now.second // 56 25

Slide 27

Slide 27 text

注意点 26

Slide 28

Slide 28 text

まだ alpha なので破壊的変更入るかも? 27

Slide 29

Slide 29 text

JVM では java.time を使った方がいいかも? 28

Slide 30

Slide 30 text

実装が JVM だと java.time のラッパー 29

Slide 31

Slide 31 text

java.time みたいに ZonedDateTime や OffsetDateTime といったものはない 30

Slide 32

Slide 32 text

→ Instant を適宜タイムゾーンに応じて変換する 31

Slide 33

Slide 33 text

LocalDateTime は直接計算できない 32

Slide 34

Slide 34 text

→ Instant にしてから計算して戻す 33

Slide 35

Slide 35 text

Instant にしてから計算して戻す val timeZone = TimeZone.currentSystemDefault() val now = Clock.System.now().toLocalDateTime(timeZone) val sameTimeInTomorrow = (now.toInstant(timeZone) + 1.days) .toLocalDateTime(timeZone) 34

Slide 36

Slide 36 text

Enjoy kotlinx.datetime 35