core-time: add TimeBridge (Instant <-> epoch millis)

Generic content-provider time bridge shared by the family: Long epoch millis
<-> kotlin.time.Instant. Extracted from Calendula for Phase 1 (Calendula as the
second core-time consumer). 3 unit tests; module suite now 5 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-27 23:37:25 +02:00
parent d3ae83f1a4
commit 7efad77fde
2 changed files with 35 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
package de.jeanlucmakiola.floret.time
import kotlin.time.Instant
/** Epoch milliseconds (as stored by Android content providers) → [Instant]. */
fun Long.toKotlinInstantFromEpochMillis(): Instant = Instant.fromEpochMilliseconds(this)
/** [Instant] → epoch milliseconds, for writing back to a content provider. */
fun Instant.toEpochMillis(): Long = toEpochMilliseconds()

View File

@@ -0,0 +1,26 @@
package de.jeanlucmakiola.floret.time
import com.google.common.truth.Truth.assertThat
import kotlin.time.Instant
import org.junit.jupiter.api.Test
class TimeBridgeTest {
@Test
fun `epoch millis round-trips through Instant`() {
val original = 1_717_840_800_000L // 2024-06-08T10:00:00Z
val instant = original.toKotlinInstantFromEpochMillis()
assertThat(instant.toEpochMillis()).isEqualTo(original)
}
@Test
fun `zero millis maps to Instant epoch`() {
assertThat(0L.toKotlinInstantFromEpochMillis()).isEqualTo(Instant.fromEpochMilliseconds(0L))
}
@Test
fun `negative epoch millis is supported`() {
val original = -1_000_000L
assertThat(original.toKotlinInstantFromEpochMillis().toEpochMillis()).isEqualTo(original)
}
}