Skip to content
Snippets Groups Projects
Verified Commit fb888db2 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

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.
parent cd845f03
No related branches found
No related tags found
No related merge requests found
Pipeline #345 passed
...@@ -29,10 +29,11 @@ import java.nio.ByteBuffer ...@@ -29,10 +29,11 @@ import java.nio.ByteBuffer
object DateTimeSerializer : Serializer<Temporal> { object DateTimeSerializer : Serializer<Temporal> {
enum class TimeSpec(val value: Byte) { enum class TimeSpec(val value: Byte) {
LocalTime(0), LocalUnknown(-1),
UTC(1), LocalStandard(0),
OffsetFromUTC(2), LocalDST(1),
TimeZone(3); UTC(2),
OffsetFromUTC(3);
companion object { companion object {
private val map = TimeSpec.values().associateBy(TimeSpec::value) private val map = TimeSpec.values().associateBy(TimeSpec::value)
...@@ -45,7 +46,7 @@ object DateTimeSerializer : Serializer<Temporal> { ...@@ -45,7 +46,7 @@ object DateTimeSerializer : Serializer<Temporal> {
is LocalDateTime -> { is LocalDateTime -> {
IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features) IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features)
IntSerializer.serialize(buffer, data.getLong(ChronoField.MILLI_OF_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 -> { is OffsetDateTime -> {
IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features) IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features)
...@@ -76,16 +77,25 @@ object DateTimeSerializer : Serializer<Temporal> { ...@@ -76,16 +77,25 @@ object DateTimeSerializer : Serializer<Temporal> {
val julianDay = IntSerializer.deserialize(buffer, features).toLong() val julianDay = IntSerializer.deserialize(buffer, features).toLong()
val milliOfDay = IntSerializer.deserialize(buffer, features).toLong() val milliOfDay = IntSerializer.deserialize(buffer, features).toLong()
val timeSpec = TimeSpec.of(ByteSerializer.deserialize(buffer, features)) val timeSpec = TimeSpec.of(ByteSerializer.deserialize(buffer, features))
?: TimeSpec.LocalUnknown
if (milliOfDay == -1L || julianDay == -1L) if (milliOfDay == -1L || julianDay == -1L)
return Instant.EPOCH return Instant.EPOCH
return when (timeSpec) { return when (timeSpec) {
TimeSpec.LocalTime -> TimeSpec.LocalStandard,
Instant.EPOCH.atZone(ZoneOffset.systemDefault()) TimeSpec.LocalUnknown,
TimeSpec.LocalDST ->
Instant.EPOCH
.atZone(ZoneOffset.systemDefault())
.with(JulianFields.JULIAN_DAY, julianDay) .with(JulianFields.JULIAN_DAY, julianDay)
.with(ChronoField.MILLI_OF_DAY, milliOfDay) .with(ChronoField.MILLI_OF_DAY, milliOfDay)
.toInstant() TimeSpec.OffsetFromUTC ->
else -> Instant.EPOCH
Instant.EPOCH.atOffset(ZoneOffset.UTC) .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(JulianFields.JULIAN_DAY, julianDay)
.with(ChronoField.MILLI_OF_DAY, milliOfDay) .with(ChronoField.MILLI_OF_DAY, milliOfDay)
.toInstant() .toInstant()
......
...@@ -37,7 +37,7 @@ class DateTimeSerializerTest { ...@@ -37,7 +37,7 @@ class DateTimeSerializerTest {
fun testEpochAtTimezone() { fun testEpochAtTimezone() {
val value = Instant.EPOCH.atOffset(ZoneOffset.ofTotalSeconds(1234)) val value = Instant.EPOCH.atOffset(ZoneOffset.ofTotalSeconds(1234))
assertEquals( assertEquals(
value.atZoneSimilarLocal(ZoneOffset.UTC).toInstant(), value,
roundTrip(DateTimeSerializer, value) roundTrip(DateTimeSerializer, value)
) )
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment