Skip to content

Commit

Permalink
add support for hh:mm:ss timezone format
Browse files Browse the repository at this point in the history
  • Loading branch information
5d committed Dec 7, 2023
1 parent b37416c commit cc1aeb5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@
import Foundation

extension TimeZone {
private static let iso8601TimeZoneHHColonMMColonSSRegex = try? NSRegularExpression(pattern: "^[+-]\\d{2}:\\d{2}:\\d{2}$")
private static let iso8601TimeZoneHHColonMMRegex = try? NSRegularExpression(pattern: "^[+-]\\d{2}:\\d{2}$")
private static let iso8601TimeZoneHHMMRegex = try? NSRegularExpression(pattern: "^[+-]\\d{2}\\d{2}$")
private static let iso8601TimeZoneHHRegex = try? NSRegularExpression(pattern: "^[+-]\\d{2}$")

/// ±hh:mm:ss is not a standard of ISO8601 date format, but it's supported by AWSDateTime.
/// https://docs.aws.amazon.com/appsync/latest/devguide/scalars.html
private enum ISO8601TimeZonePart {
case utc
case hhmmss(hours: Int, minutes: Int, seconds: Int)
case hhmm(hours: Int, minutes: Int)
case hh(hours: Int)

Expand All @@ -25,6 +29,17 @@ extension TimeZone {
} != nil
}

// <time>±hh:mm:ss
func suffixHHColonMMColonSS() -> String? {
if iso8601DateString.count > 9 {
let tz = String(iso8601DateString.dropFirst(iso8601DateString.count - 9))
if hasMatch(regex: TimeZone.iso8601TimeZoneHHColonMMColonSSRegex, str: tz) {
return tz
}
}
return nil
}

// <time>±hh:mm
func suffixHHColonMM() -> String? {
if iso8601DateString.count > 6 {
Expand Down Expand Up @@ -86,6 +101,15 @@ extension TimeZone {
return
}

if let tz = suffixHHColonMMColonSS(),
let hours = Int(tz.dropLast(6)),
let minutes = Int(tz.dropFirst(4).dropLast(3)),
let seconds = Int(tz.dropFirst(7))
{
self = .hhmmss(hours: hours, minutes: minutes, seconds: seconds)
return
}

return nil
}
}
Expand All @@ -101,6 +125,10 @@ extension TimeZone {
case let .some(.hhmm(hours: hours, minutes: minutes)):
self.init(secondsFromGMT: hours * 60 * 60 +
(hours > 0 ? 1 : -1) * minutes * 60)
case let .some(.hhmmss(hours: hours, minutes: minutes, seconds: seconds)):
self.init(secondsFromGMT: hours * 60 * 60 +
(hours > 0 ? 1 : -1) * minutes * 60 +
(hours > 0 ? 1 : -1) * seconds)
case .none:
return nil
}
Expand Down
10 changes: 10 additions & 0 deletions AmplifyTests/CategoryTests/DataStore/TemporalTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,20 @@ class TemporalTests: XCTestCase {
do {
let datetime = try Temporal.DateTime(iso8601String: "2023-11-30T11:04:03-08:00")
XCTAssertEqual(datetime.iso8601String, "2023-11-30T11:04:03.000-08:00")
let datetime0 = try Temporal.DateTime(iso8601String: "2023-11-30T11:04:03+08:00")
XCTAssertEqual(datetime0.iso8601String, "2023-11-30T11:04:03.000+08:00")
let datetime1 = try Temporal.DateTime(iso8601String: "2023-11-30T11:04:03.322-0800")
XCTAssertEqual(datetime1.iso8601String, "2023-11-30T11:04:03.322-08:00")
let datetime2 = try Temporal.DateTime(iso8601String: "2023-11-30T14:09:27.128-0830")
XCTAssertEqual(datetime2.iso8601String, "2023-11-30T14:09:27.128-08:30")
let datetime3 = try Temporal.DateTime(iso8601String: "2023-11-30T14:09:27.128-0339")
XCTAssertEqual(datetime3.iso8601String, "2023-11-30T14:09:27.128-03:39")
let datetime4 = try Temporal.DateTime(iso8601String: "2023-11-30T14:09:27.128-0000")
XCTAssertEqual(datetime4.iso8601String, "2023-11-30T14:09:27.128Z")
let datetime5 = try Temporal.DateTime(iso8601String: "2023-11-30T11:04:03+08:00:21")
XCTAssertEqual(datetime5.iso8601String, "2023-11-30T11:03:42.000+08:00")
let datetime6 = try Temporal.DateTime(iso8601String: "2023-11-30T11:04:03-08:00:21")
XCTAssertEqual(datetime6.iso8601String, "2023-11-30T11:04:24.000-08:00")
let date = try Temporal.Date(iso8601String: "2023-11-30-08:00")
XCTAssertEqual(date.iso8601String, "2023-11-30Z")
let time = try Temporal.Time(iso8601String: "11:00:00.000-08:00")
Expand Down

0 comments on commit cc1aeb5

Please sign in to comment.