@@ -214,6 +214,61 @@ public struct NaiveDateTime: Equatable, Hashable, Comparable, LosslessStringConv
214214}
215215
216216
217+ // MARK: - Calendar Extensions -
218+
219+ public extension Calendar {
220+ // MARK: Naive* -> Date
221+
222+ /// Returns a date created from the specified naive date in a given time zone.
223+ /// - parameter timeZone: `nil` by default (uses Calendar time zone).
224+ public func date( from date: NaiveDate , in timeZone: TimeZone ? = nil ) -> Date ? {
225+ return _date ( from: date, in: timeZone)
226+ }
227+
228+ /// Returns a date created from the specified naive time in a given time zone.
229+ /// - parameter timeZone: `nil` by default (uses Calendar time zone).
230+ public func date( from time: NaiveTime , in timeZone: TimeZone ? = nil ) -> Date ? {
231+ return _date ( from: time, in: timeZone)
232+ }
233+
234+ /// Returns a date created from the specified naive datetime in a given time zone.
235+ /// - parameter timeZone: `nil` by default (uses Calendar time zone).
236+ public func date( from dateTime: NaiveDateTime , in timeZone: TimeZone ? = nil ) -> Date ? {
237+ return _date ( from: dateTime, in: timeZone)
238+ }
239+
240+ internal func _date< T: _DateComponentsConvertible > ( from value: T , in timeZone: TimeZone ? = nil ) -> Date ? {
241+ return self . date ( from: value. dateComponents ( timeZone: timeZone) )
242+ }
243+
244+ // MARK: Date -> Naive*
245+
246+ /// Returns naive date from a date, as if in a given time zone.
247+ /// - parameter timeZone: `nil` by default (uses Calendar time zone).
248+ public func naiveDate( from date: Date , in timeZone: TimeZone ? = nil ) -> NaiveDate {
249+ let components = self . dateComponents ( in: timeZone ?? self . timeZone, from: date)
250+ return NaiveDate ( year: components. year!, month: components. month!, day: components. day!)
251+ }
252+
253+ /// Returns naive time from a date, as if in a given time zone.
254+ /// - parameter timeZone: `nil` by default (uses Calendar time zone).
255+ public func naiveTime( from date: Date , in timeZone: TimeZone ? = nil ) -> NaiveTime {
256+ let components = self . dateComponents ( in: timeZone ?? self . timeZone, from: date)
257+ return NaiveTime ( hour: components. hour!, minute: components. minute!, second: components. second!)
258+ }
259+
260+ /// Returns naive time from a date, as if in a given time zone.
261+ /// - parameter timeZone: `nil` by default (uses Calendar time zone).
262+ public func naiveDateTime( from date: Date , in timeZone: TimeZone ? = nil ) -> NaiveDateTime {
263+ let components = self . dateComponents ( in: timeZone ?? self . timeZone, from: date)
264+ return NaiveDateTime (
265+ date: NaiveDate ( year: components. year!, month: components. month!, day: components. day!) ,
266+ time: NaiveTime ( hour: components. hour!, minute: components. minute!, second: components. second!)
267+ )
268+ }
269+ }
270+
271+
217272// MARK: - Private -
218273
219274/// A type that can be converted to DateComponents (and in turn to Date).
0 commit comments