1
1
package dev.gitlive.firebase.firestore
2
2
3
+ import dev.gitlive.firebase.FirebaseDecoder
3
4
import dev.gitlive.firebase.FirebaseEncoder
4
5
import dev.gitlive.firebase.SpecialValueSerializer
5
6
import dev.gitlive.firebase.firestore.DoubleAsTimestampSerializer.serverTimestamp
6
7
import kotlinx.serialization.Serializable
7
8
import kotlinx.serialization.SerializationException
9
+ import kotlin.time.Duration
10
+ import kotlin.time.Duration.Companion.milliseconds
11
+ import kotlin.time.Duration.Companion.nanoseconds
12
+ import kotlin.time.Duration.Companion.seconds
13
+ import kotlin.time.DurationUnit
8
14
9
15
/* * A class representing a platform specific Firebase Timestamp. */
10
16
expect class NativeTimestamp
@@ -31,11 +37,16 @@ expect class Timestamp internal constructor(nativeValue: NativeTimestamp): BaseT
31
37
object ServerTimestamp: BaseTimestamp
32
38
}
33
39
34
- fun Timestamp.Companion.fromMilliseconds (milliseconds : Double ): Timestamp =
35
- Timestamp ((milliseconds / 1000 ).toLong(), ((milliseconds % 1000 ) * 1000000 ).toInt())
36
- fun Timestamp.toMilliseconds (): Double = seconds * 1000 + nanoseconds / 1000000.0
40
+ fun Timestamp.Companion.fromDuration (duration : Duration ): Timestamp =
41
+ duration.toComponents { seconds, nanoseconds ->
42
+ Timestamp (seconds, nanoseconds)
43
+ }
44
+ fun Timestamp.toDuration (): Duration = seconds.seconds + nanoseconds.nanoseconds
45
+
46
+ fun Timestamp.Companion.fromMilliseconds (milliseconds : Double ): Timestamp = fromDuration(milliseconds.milliseconds)
47
+ fun Timestamp.toMilliseconds (): Double = toDuration().toDouble(DurationUnit .MILLISECONDS )
37
48
38
- /* * A serializer for [BaseTimestamp]. If used with [FirebaseEncoder] performs serialization using native Firebase mechanisms . */
49
+ /* * A serializer for [BaseTimestamp]. Must be used with [FirebaseEncoder]/[FirebaseDecoder] . */
39
50
object BaseTimestampSerializer : SpecialValueSerializer<BaseTimestamp>(
40
51
serialName = " Timestamp" ,
41
52
toNativeValue = { value ->
@@ -54,7 +65,7 @@ object BaseTimestampSerializer : SpecialValueSerializer<BaseTimestamp>(
54
65
}
55
66
)
56
67
57
- /* * A serializer for [Timestamp]. If used with [FirebaseEncoder] performs serialization using native Firebase mechanisms . */
68
+ /* * A serializer for [Timestamp]. Must be used with [FirebaseEncoder]/[FirebaseDecoder] . */
58
69
object TimestampSerializer : SpecialValueSerializer<Timestamp>(
59
70
serialName = " Timestamp" ,
60
71
toNativeValue = Timestamp : :nativeValue,
@@ -66,7 +77,7 @@ object TimestampSerializer : SpecialValueSerializer<Timestamp>(
66
77
}
67
78
)
68
79
69
- /* * A serializer for [Timestamp.ServerTimestamp]. If used with [FirebaseEncoder] performs serialization using native Firebase mechanisms . */
80
+ /* * A serializer for [Timestamp.ServerTimestamp]. Must be used with [FirebaseEncoder]/[FirebaseDecoder] . */
70
81
object ServerTimestampSerializer : SpecialValueSerializer<Timestamp.ServerTimestamp>(
71
82
serialName = " Timestamp" ,
72
83
toNativeValue = { FieldValue .serverTimestamp.nativeValue },
@@ -84,7 +95,7 @@ object DoubleAsTimestampSerializer : SpecialValueSerializer<Double>(
84
95
toNativeValue = { value ->
85
96
when (value) {
86
97
serverTimestamp -> FieldValue .serverTimestamp.nativeValue
87
- else -> Timestamp .fromMilliseconds(value)
98
+ else -> Timestamp .fromMilliseconds(value).nativeValue
88
99
}
89
100
},
90
101
fromNativeValue = { value ->
0 commit comments