From fb888db22e0b4b6ef2ad4e0bef749cab4d812269 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Mon, 14 Jan 2019 12:51:33 +0100 Subject: [PATCH] Fixed DateTimeSerializer Qt actually has two TimeSpecs, one public and one private and only used internally. It is this private one that is used to serialize DateTime objects, though. --- .../serializer/DateTimeSerializer.kt | 30 ++++++++++++------- .../serializer/DateTimeSerializerTest.kt | 2 +- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt index 39af33ca9..d349868ca 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt @@ -29,10 +29,11 @@ import java.nio.ByteBuffer object DateTimeSerializer : Serializer<Temporal> { enum class TimeSpec(val value: Byte) { - LocalTime(0), - UTC(1), - OffsetFromUTC(2), - TimeZone(3); + LocalUnknown(-1), + LocalStandard(0), + LocalDST(1), + UTC(2), + OffsetFromUTC(3); companion object { private val map = TimeSpec.values().associateBy(TimeSpec::value) @@ -45,7 +46,7 @@ object DateTimeSerializer : Serializer<Temporal> { is LocalDateTime -> { IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features) IntSerializer.serialize(buffer, data.getLong(ChronoField.MILLI_OF_DAY).toInt(), features) - ByteSerializer.serialize(buffer, TimeSpec.LocalTime.value, features) + ByteSerializer.serialize(buffer, TimeSpec.LocalUnknown.value, features) } is OffsetDateTime -> { IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features) @@ -76,16 +77,25 @@ object DateTimeSerializer : Serializer<Temporal> { val julianDay = IntSerializer.deserialize(buffer, features).toLong() val milliOfDay = IntSerializer.deserialize(buffer, features).toLong() val timeSpec = TimeSpec.of(ByteSerializer.deserialize(buffer, features)) + ?: TimeSpec.LocalUnknown if (milliOfDay == -1L || julianDay == -1L) return Instant.EPOCH return when (timeSpec) { - TimeSpec.LocalTime -> - Instant.EPOCH.atZone(ZoneOffset.systemDefault()) + TimeSpec.LocalStandard, + TimeSpec.LocalUnknown, + TimeSpec.LocalDST -> + Instant.EPOCH + .atZone(ZoneOffset.systemDefault()) .with(JulianFields.JULIAN_DAY, julianDay) .with(ChronoField.MILLI_OF_DAY, milliOfDay) - .toInstant() - else -> - Instant.EPOCH.atOffset(ZoneOffset.UTC) + TimeSpec.OffsetFromUTC -> + Instant.EPOCH + .atOffset(ZoneOffset.ofTotalSeconds(IntSerializer.deserialize(buffer, features))) + .with(JulianFields.JULIAN_DAY, julianDay) + .with(ChronoField.MILLI_OF_DAY, milliOfDay) + TimeSpec.UTC -> + Instant.EPOCH + .atOffset(ZoneOffset.UTC) .with(JulianFields.JULIAN_DAY, julianDay) .with(ChronoField.MILLI_OF_DAY, milliOfDay) .toInstant() diff --git a/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt b/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt index 761fcc6ef..cd01454a6 100644 --- a/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt @@ -37,7 +37,7 @@ class DateTimeSerializerTest { fun testEpochAtTimezone() { val value = Instant.EPOCH.atOffset(ZoneOffset.ofTotalSeconds(1234)) assertEquals( - value.atZoneSimilarLocal(ZoneOffset.UTC).toInstant(), + value, roundTrip(DateTimeSerializer, value) ) } -- GitLab