diff --git a/Sources/GPXKit/GPXExporter.swift b/Sources/GPXKit/GPXExporter.swift index 81ed82f..f2a71f9 100644 --- a/Sources/GPXKit/GPXExporter.swift +++ b/Sources/GPXKit/GPXExporter.swift @@ -5,11 +5,6 @@ import FoundationXML /// A class for exporting a `GPXTrack` to an xml string. public final class GPXExporter { - private lazy var iso8601Formatter: ISO8601DateFormatter = { - let formatter = ISO8601DateFormatter() - formatter.formatOptions = .withInternetDateTime - return formatter - }() private let track: GPXTrack private let exportDate: Bool @@ -45,7 +40,7 @@ public final class GPXExporter { private var metaDataTime: String { guard exportDate, let date = track.date else { return "" } - return GPXTags.time.embed(iso8601Formatter.string(from: date)) + return GPXTags.time.embed(ISO8601DateFormatter.gpxKit.string(from: date)) } private var trackXML: String { @@ -58,7 +53,7 @@ public final class GPXExporter { ].joined(separator: " ") let childs = [GPXTags.elevation.embed(String(format:"%.2f", point.coordinate.elevation)), exportDate ? point.date.flatMap { - GPXTags.time.embed(iso8601Formatter.string(from: $0)) + GPXTags.time.embed(ISO8601DateFormatter.gpxKit.string(from: $0)) } : nil ].compactMap { $0 }.joined(separator: "\n") return GPXTags.trackPoint.embed( diff --git a/Sources/GPXKit/GPXFileParser.swift b/Sources/GPXKit/GPXFileParser.swift index 68ec1f3..f9eb1df 100644 --- a/Sources/GPXKit/GPXFileParser.swift +++ b/Sources/GPXKit/GPXFileParser.swift @@ -168,12 +168,6 @@ internal extension TrackPoint { } internal extension XMLNode { - static var iso8601Formatter: ISO8601DateFormatter = { - let formatter = ISO8601DateFormatter() - formatter.formatOptions = .withInternetDateTime - return formatter - }() - var latitude: Double? { Double(attributes[GPXAttributes.latitude.rawValue] ?? "") } @@ -184,7 +178,7 @@ internal extension XMLNode { Double(content) } var date: Date? { - XMLNode.iso8601Formatter.date(from: content) + ISO8601DateFormatter.gpxKit.date(from: content) } var power: Measurement? { Double(content).flatMap { diff --git a/Sources/GPXKit/ISO8601DateFormatter.swift b/Sources/GPXKit/ISO8601DateFormatter.swift new file mode 100644 index 0000000..d7cb3b0 --- /dev/null +++ b/Sources/GPXKit/ISO8601DateFormatter.swift @@ -0,0 +1,13 @@ +import Foundation + +extension ISO8601DateFormatter { + static var gpxKit: ISO8601DateFormatter = { + let formatter = ISO8601DateFormatter() + if #available(macOS 10.13, *) { + formatter.formatOptions = .withFractionalSeconds + } else { + formatter.formatOptions = .withInternetDateTime + } + return formatter + }() +} diff --git a/Tests/GPXKitTests/GPXExporterTests.swift b/Tests/GPXKitTests/GPXExporterTests.swift index e156063..17a394e 100644 --- a/Tests/GPXKitTests/GPXExporterTests.swift +++ b/Tests/GPXKitTests/GPXExporterTests.swift @@ -10,7 +10,7 @@ final class GPXExporterTests: XCTestCase { private var parseError: GPXParserError? private var iso8601Formatter: ISO8601DateFormatter = { let formatter = ISO8601DateFormatter() - formatter.formatOptions = .withInternetDateTime + formatter.formatOptions = .withFractionalSeconds return formatter }() private var result: GPXKit.XMLNode! diff --git a/Tests/GPXKitTests/GPXParserTests.swift b/Tests/GPXKitTests/GPXParserTests.swift index f9e29ee..90d0605 100644 --- a/Tests/GPXKitTests/GPXParserTests.swift +++ b/Tests/GPXKitTests/GPXParserTests.swift @@ -72,9 +72,9 @@ class GPXParserTests: XCTestCase { let expected = [ TrackPoint(coordinate: Coordinate(latitude: 51.2760600, longitude: 12.3769500, elevation: 114.2), - date: expectedDate(for: "2020-03-18T12:39:47Z")), + date: expectedDate(for: "2020-07-03T13:20:50.000Z")), TrackPoint(coordinate: Coordinate(latitude: 51.2760420, longitude: 12.3769760, elevation: 114.0), - date: expectedDate(for: "2020-03-18T12:39:48Z")) + date: expectedDate(for: "2020-03-18T12:45:48Z")) ] assertTracksAreEqual(GPXTrack(date: expectedDate(for: "2020-03-18T12:39:47Z"), diff --git a/Tests/GPXKitTests/TestFixtures.swift b/Tests/GPXKitTests/TestFixtures.swift index 95c2ae8..509438a 100644 --- a/Tests/GPXKitTests/TestFixtures.swift +++ b/Tests/GPXKitTests/TestFixtures.swift @@ -50,11 +50,11 @@ let testXMLWithoutExtensions = """ 114.2 - + 114.0 - + @@ -107,7 +107,7 @@ let testTrack = GPXTrack(date: expectedDate(for: "2020-03-18T12:39:47Z"), TrackPoint(coordinate: Coordinate(latitude: 51.2760600, longitude: 12.3769500, elevation: 114.2), date: expectedDate(for: "2020-03-18T12:39:47Z")), TrackPoint(coordinate: Coordinate(latitude: 51.2760420, longitude: 12.3769760, elevation: 114.0), - date: expectedDate(for: "2020-03-18T12:39:48Z")) + date: expectedDate(for: "2020-03-18T12:45:48Z")) ]) let testTrackWithoutTime = GPXTrack(date: nil, diff --git a/Tests/GPXKitTests/TestHelpers.swift b/Tests/GPXKitTests/TestHelpers.swift index 9b4a221..dd7f3c0 100644 --- a/Tests/GPXKitTests/TestHelpers.swift +++ b/Tests/GPXKitTests/TestHelpers.swift @@ -33,7 +33,7 @@ public func XCTAssertEqual(_ expected: @autoclosure () throws -> T fileprivate var iso8601Formatter: ISO8601DateFormatter = { let formatter = ISO8601DateFormatter() - formatter.formatOptions = .withInternetDateTime + formatter.formatOptions = .withFractionalSeconds return formatter }()