@@ -139,20 +139,57 @@ public extension JSONEncoder.KeyEncodingStrategy {
139139extension JSONEncoder . DateEncodingStrategy {
140140
141141 func encode( _ date: Date , encoder: Encoder ) throws {
142- if case . deferredToDate = self {
142+ #if os(Linux) && swift(>=5.10)
143+ let jsonEncoder = JSONEncoder ( )
144+ jsonEncoder. dateEncodingStrategy = self
145+
146+ /// Encode the date using the current encoding strategy
147+ let encodedData = try jsonEncoder. encode ( date)
148+
149+ /// Decode as CustomDate (String or Number)
150+ let value = try JSONDecoder ( ) . decode ( CustomDate . self, from: encodedData)
151+ if let string = value. string {
152+ try string. encode ( to: encoder)
153+ } else if let number = value. number {
154+ try number. encode ( to: encoder)
155+ } else {
156+ throw EncodingError . invalidValue (
157+ value,
158+ EncodingError . Context ( codingPath: encoder. codingPath, debugDescription: " Invalid date encoding. " )
159+ )
160+ }
161+ #else
162+ switch self {
163+ case . deferredToDate:
143164 try date. encode ( to: encoder)
144- } else if case . secondsSince1970 = self {
145- try date. timeIntervalSince1970. encode ( to: encoder)
146- } else if case . millisecondsSince1970 = self {
165+ case . millisecondsSince1970:
147166 try ( date. timeIntervalSince1970 * 1000 ) . encode ( to: encoder)
148- } else if case . iso8601 = self {
167+ case . secondsSince1970:
168+ try date. timeIntervalSince1970. encode ( to: encoder)
169+ case . iso8601:
149170 try _iso8601Formatter. string ( from: date) . encode ( to: encoder)
150- } else if case let . formatted( formatter) = self {
171+ case let . formatted( formatter) :
151172 try formatter. string ( from: date) . encode ( to: encoder)
152- } else if case let . custom( closure) = self {
173+ case let . custom( closure) :
153174 try closure ( date, encoder)
154- } else {
155- try date. timeIntervalSince1970. encode ( to: encoder)
175+ @unknown default :
176+ try date. encode ( to: encoder)
177+ }
178+ #endif
179+ }
180+ }
181+
182+ private struct CustomDate : Decodable {
183+
184+ var string : String ?
185+ var number : Double ?
186+
187+ init ( from decoder: Decoder ) throws {
188+ let container = try decoder. singleValueContainer ( )
189+ if let string = try ? container. decode ( String . self) {
190+ self . string = string
191+ } else if let number = try ? container. decode ( Double . self) {
192+ self . number = number
156193 }
157194 }
158195}
0 commit comments