From 16a9f1a693f59e4cee2a23f18269a3ef5408d8a4 Mon Sep 17 00:00:00 2001 From: Vignesh Date: Tue, 12 Jan 2021 15:29:39 +0530 Subject: [PATCH 1/2] Update Region.swift Updated the Region initialiser as firstWeekday is getting reset on setting the locale --- Sources/SwiftDate/DateInRegion/Region.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/SwiftDate/DateInRegion/Region.swift b/Sources/SwiftDate/DateInRegion/Region.swift index 8818a95e..fb56937e 100644 --- a/Sources/SwiftDate/DateInRegion/Region.swift +++ b/Sources/SwiftDate/DateInRegion/Region.swift @@ -50,6 +50,8 @@ public struct Region: Decodable, Encodable, Equatable, Hashable, CustomStringCon self.calendar = Calendar.newCalendar(calendar, configure: { $0.timeZone = zone.toTimezone() $0.locale = locale.toLocale() + $0.firstWeekday = calendar.toCalendar().firstWeekday + $0.minimumDaysInFirstWeek = calendar.toCalendar().minimumDaysInFirstWeek }) } From 3c03ac3de625985b8fd46fa78c6256af00f161c0 Mon Sep 17 00:00:00 2001 From: Vignesh Thangamariappan Date: Tue, 12 Jan 2021 17:19:39 +0530 Subject: [PATCH 2/2] Added Test Cases to check FirstWeekDay --- .../RelativeFormatterLanguage.swift | 8 ++++---- .../Foundation+Extras/Int+DateComponents.swift | 2 +- .../Foundation+Extras/String+Parser.swift | 2 +- Sources/SwiftDate/Supports/Commons.swift | 14 +++++++------- .../TestDateInRegion+Components.swift | 4 ++-- Tests/SwiftDateTests/TestRegion.swift | 12 ++++++++++++ Tests/SwiftDateTests/TestSwiftDate.swift | 8 ++++---- 7 files changed, 31 insertions(+), 19 deletions(-) diff --git a/Sources/SwiftDate/Formatters/RelativeFormatter/RelativeFormatterLanguage.swift b/Sources/SwiftDate/Formatters/RelativeFormatter/RelativeFormatterLanguage.swift index ca893c29..0f0ec114 100644 --- a/Sources/SwiftDate/Formatters/RelativeFormatter/RelativeFormatterLanguage.swift +++ b/Sources/SwiftDate/Formatters/RelativeFormatter/RelativeFormatterLanguage.swift @@ -18,16 +18,16 @@ internal class RelativeFormatterLanguagesCache { @Atomic private(set) var cachedValues = [String: [String: Any]]() - + func flavoursForLocaleID(_ langID: String) -> [String: Any]? { do { - + guard let cachedValue = cachedValues[langID] else { var fileURL = Bundle.appModule?.url(forResource: langID, withExtension: "json", subdirectory: "langs") if fileURL == nil { fileURL = Bundle(for: RelativeFormatter.self).resourceURL?.appendingPathComponent("langs/\(langID).json") } - + guard let fullURL = fileURL else { return nil } @@ -40,7 +40,7 @@ internal class RelativeFormatterLanguagesCache { } return nil } - + return cachedValue } catch { diff --git a/Sources/SwiftDate/Foundation+Extras/Int+DateComponents.swift b/Sources/SwiftDate/Foundation+Extras/Int+DateComponents.swift index 6a5725e5..00fd88ee 100644 --- a/Sources/SwiftDate/Foundation+Extras/Int+DateComponents.swift +++ b/Sources/SwiftDate/Foundation+Extras/Int+DateComponents.swift @@ -26,7 +26,7 @@ public extension Int { /// - returns: return self value in form of `DateComponents` where given `Calendar.Component` has `self` as value internal func toDateComponents(type: Calendar.Component) -> DateComponents { var dateComponents = DateComponents() - DateComponents.allComponents.forEach( { dateComponents.setValue(0, for: $0 )}) + DateComponents.allComponents.forEach({ dateComponents.setValue(0, for: $0 ) }) dateComponents.setValue(self, for: type) dateComponents.setValue(0, for: .era) return dateComponents diff --git a/Sources/SwiftDate/Foundation+Extras/String+Parser.swift b/Sources/SwiftDate/Foundation+Extras/String+Parser.swift index e9dc6ecf..6ed36671 100644 --- a/Sources/SwiftDate/Foundation+Extras/String+Parser.swift +++ b/Sources/SwiftDate/Foundation+Extras/String+Parser.swift @@ -116,7 +116,7 @@ extension String: DateParsable { public func toSQLDate(region: Region = Region.ISO) -> DateInRegion? { return StringToDateStyles.sql.toDate(self, region: region) } - + public func asLocale() -> Locale { Locale(identifier: self) } diff --git a/Sources/SwiftDate/Supports/Commons.swift b/Sources/SwiftDate/Supports/Commons.swift index e3de49c2..386515ea 100644 --- a/Sources/SwiftDate/Supports/Commons.swift +++ b/Sources/SwiftDate/Supports/Commons.swift @@ -22,7 +22,7 @@ internal struct Atomic { init(wrappedValue: Value) { self.value = wrappedValue } - + var wrappedValue: Value { get { return queue.sync { value } @@ -31,7 +31,7 @@ internal struct Atomic { queue.sync { value = newValue } } } - + } // MARK: - DateFormatter @@ -263,7 +263,7 @@ public enum DateRelatedType { case yesterday case yesterdayAtStart case nearestMinute(minute: Int) - case nearestHour(hour :Int) + case nearestHour(hour: Int) case nextWeekday(_: WeekDay) case nextDSTDate case prevMonth @@ -313,7 +313,7 @@ public struct TimeCalculationOptions { private class BundleFinder {} extension Foundation.Bundle { - + /// Returns the resource bundle associated with the current Swift module. /// This is used instead of `module` to allows compatibility outside the SwiftPM environment (ie. CocoaPods). static var appModule: Bundle? = { @@ -327,7 +327,7 @@ extension Foundation.Bundle { Bundle(for: BundleFinder.self).resourceURL, // For command-line tools. - Bundle.main.bundleURL, + Bundle.main.bundleURL ] for candidate in candidates { @@ -336,8 +336,8 @@ extension Foundation.Bundle { return bundle } } - + return nil }() - + } diff --git a/Tests/SwiftDateTests/TestDateInRegion+Components.swift b/Tests/SwiftDateTests/TestDateInRegion+Components.swift index ae1f0ccb..ddd3e18b 100644 --- a/Tests/SwiftDateTests/TestDateInRegion+Components.swift +++ b/Tests/SwiftDateTests/TestDateInRegion+Components.swift @@ -264,7 +264,7 @@ class TestDateInRegion_Components: XCTestCase { let absoluteDate_iso8601_string = absoluteDate.toISO([.withInternetDateTime]) XCTAssert( absoluteDate_iso8601_string == iso8601_string, "Failed respect the absolute ISO date") } - + func testComparingTimeUnitsWithDateComponents() { SwiftDate.defaultRegion = .local @@ -272,5 +272,5 @@ class TestDateInRegion_Components: XCTestCase { XCTAssert((now.addingTimeInterval(3600) - now).in(.hour) == 1, "Failed to compare date") XCTAssert((now.addingTimeInterval(3600) - now) == 1.hours, "Failed to compare date") } - + } diff --git a/Tests/SwiftDateTests/TestRegion.swift b/Tests/SwiftDateTests/TestRegion.swift index 55ac170b..1babce2b 100644 --- a/Tests/SwiftDateTests/TestRegion.swift +++ b/Tests/SwiftDateTests/TestRegion.swift @@ -118,6 +118,18 @@ class TestRegion: XCTestCase { } + func testRegionInit_SettingFirstWeekday() { + + var calendar = Calendars.gregorian.toCalendar() + calendar.firstWeekday = 2 + let regionStartingFromMonday = Region(calendar: calendar, zone: Zones.gmt, locale: Locales.englishUnitedStates) + XCTAssert(regionStartingFromMonday.calendar.firstWeekday == 2, "Failed to set firstWeekDay for Region") + + calendar.firstWeekday = 4 + let regionStartingFromWednesday = Region(calendar: calendar, zone: Zones.gmt, locale: Locales.englishUnitedStates) + XCTAssert(regionStartingFromWednesday.calendar.firstWeekday == 4, "Failed to set firstWeekDay for Region") + } + } func XCTAssertInTimeIntervalRange(value: Double, range: TimeInterval, _ error: String) { diff --git a/Tests/SwiftDateTests/TestSwiftDate.swift b/Tests/SwiftDateTests/TestSwiftDate.swift index 49ddc057..4cd4d7c4 100644 --- a/Tests/SwiftDateTests/TestSwiftDate.swift +++ b/Tests/SwiftDateTests/TestSwiftDate.swift @@ -27,16 +27,16 @@ class TestSwiftDate: XCTestCase { func testUTCZone() { SwiftDate.defaultRegion = Region(calendar: Calendars.gregorian, zone: Zones.asiaShanghai, locale: Locales.current) - + // DO NOT recognized the right timezone // The timezone should be UTC let wrongZone = "2020-03-13T05:40:48.000Z" - let wrongZoneDate = Date.init(wrongZone) + let wrongZoneDate = Date(wrongZone) print(wrongZoneDate!.description) XCTAssert("2020-03-13 05:40:48 +0000" == wrongZoneDate!.description) - + let iso8601Time = "2020-03-13T05:40:48+00:00" - let iso8601Date = Date.init(iso8601Time) + let iso8601Date = Date(iso8601Time) print(iso8601Date!.description) XCTAssert("2020-03-13 05:40:48 +0000" == iso8601Date!.description) }