@@ -25,19 +25,19 @@ extension Calendar {
2525 return [ . era]
2626 }
2727
28- internal func exactDate( from components: DateComponents , in timeZone: TimeZone , matching: Set < Calendar . Component > ) throws -> Date {
29- var restricted = try components. requireAndRestrict ( to: matching, lenient: self . lenientUnitsForFixedTimePeriods)
30- restricted . timeZone = timeZone
28+ internal func exactDate( from components: DateComponents , in timeZone: TimeZone , matching: Set < Calendar . Component > ) throws -> ( Date , DateComponents ) {
29+ var restrictedComponents = try components. requireAndRestrict ( to: matching, lenient: self . lenientUnitsForFixedTimePeriods)
30+ restrictedComponents . timeZone = timeZone
3131
32- guard let proposed = self . date ( from: restricted ) else {
33- let r = Region ( calendar: self , timeZone: self . timeZone, locale: self . locale ?? . current)
34- throw TimeError . invalidDateComponents ( restricted , in: r)
32+ guard let proposedDate = self . date ( from: restrictedComponents ) else {
33+ let r = Region ( calendar: self , timeZone: timeZone, locale: self . locale ?? . current)
34+ throw TimeError . invalidDateComponents ( restrictedComponents , in: r)
3535 }
3636
37- let proposedComponents = self . dateComponents ( in: timeZone, from: proposed )
37+ let proposedComponents = self . dateComponents ( in: timeZone, from: proposedDate )
3838
39- if isEraRelevant == false && restricted . era == nil {
40- restricted . era = proposedComponents. era
39+ if isEraRelevant == false && restrictedComponents . era == nil {
40+ restrictedComponents . era = proposedComponents. era
4141 }
4242
4343 for unit in matching {
@@ -48,13 +48,15 @@ extension Calendar {
4848 // appears to be restricted to within about 24,000 nanoseconds
4949 if unit == . nanosecond { continue }
5050
51- guard proposedComponents. value ( for: unit) == restricted . value ( for: unit) else {
51+ guard proposedComponents. value ( for: unit) == restrictedComponents . value ( for: unit) else {
5252 let r = Region ( calendar: self , timeZone: self . timeZone, locale: self . locale ?? . current)
53- throw TimeError . invalidDateComponents ( restricted , in: r)
53+ throw TimeError . invalidDateComponents ( restrictedComponents , in: r)
5454 }
5555 }
5656
57- return proposed
57+ let actualComponents = try ! proposedComponents. requireAndRestrict ( to: matching, lenient: [ ] )
58+
59+ return ( proposedDate, actualComponents)
5860 }
5961
6062 internal func range( of unit: Calendar . Component , containing date: Date ) -> Range < Date > {
0 commit comments