@@ -9,32 +9,36 @@ import Foundation
99
1010/// Formatting without time zones.
1111public final class NaiveDateFormatter {
12- private var formatter = DateFormatter ( )
13- private let converter = NaiveDateTimeConverter ( )
12+ private let formatter = DateFormatter ( )
1413
15- public init ( locale: Locale = Locale . current, format: String ) {
16- formatter. locale = locale
17- formatter. timeZone = converter. timeZone // important! UTC to UTC
18- formatter. dateFormat = format
14+ public init ( _ closure: ( _ formatter: DateFormatter ) -> Void ) {
15+ closure ( formatter)
16+ self . formatter. timeZone = TimeZone . _utc // important! UTC to UTC
1917 }
2018
21- public init ( locale: Locale = Locale . current, dateStyle: DateFormatter . Style = . none, timeStyle: DateFormatter . Style = . none) {
22- formatter. locale = locale
23- formatter. timeZone = converter. timeZone // important! UTC to UTC
24- formatter. dateStyle = dateStyle
25- formatter. timeStyle = timeStyle
19+ public convenience init ( format: String ) {
20+ self . init {
21+ $0. dateFormat = format
22+ }
2623 }
2724
28- public func string( from date: NaiveDate ) -> String ? {
29- return converter. date ( from: date) . map { formatter. string ( from: $0) }
25+ public convenience init ( dateStyle: DateFormatter . Style = . none, timeStyle: DateFormatter . Style = . none) {
26+ self . init {
27+ $0. dateStyle = dateStyle
28+ $0. timeStyle = timeStyle
29+ }
3030 }
3131
32- public func string( from time : NaiveTime ) -> String ? {
33- return converter . date ( from: time ) . map { formatter. string ( from: $0) }
32+ public func string( from value : NaiveDate ) -> String ? {
33+ return formatter . calendar . _utcDate ( from: value ) . map { formatter. string ( from: $0) }
3434 }
3535
36- public func string( from dateTime: NaiveDateTime ) -> String ? {
37- return converter. date ( from: dateTime) . map { formatter. string ( from: $0) }
36+ public func string( from value: NaiveTime ) -> String ? {
37+ return formatter. calendar. _utcDate ( from: value) . map { formatter. string ( from: $0) }
38+ }
39+
40+ public func string( from value: NaiveDateTime ) -> String ? {
41+ return formatter. calendar. _utcDate ( from: value) . map { formatter. string ( from: $0) }
3842 }
3943}
4044
@@ -44,48 +48,52 @@ public final class NaiveDateFormatter {
4448/// Formatting without time zones.
4549public final class NaiveDateRangeFormatter {
4650 private let formatter = DateIntervalFormatter ( )
47- private let converter = NaiveDateTimeConverter ( )
4851
49- public init ( locale: Locale = Locale . current, format: String ) {
50- formatter. locale = locale
51- formatter. timeZone = converter. timeZone // important! UTC to UTC
52- formatter. dateTemplate = format
52+ public init ( _ closure: ( _ formatter: DateIntervalFormatter ) -> Void ) {
53+ closure ( formatter)
54+ self . formatter. timeZone = TimeZone . _utc // important! UTC to UTC
5355 }
5456
55- public init ( locale: Locale = Locale . current, dateStyle: DateIntervalFormatter . Style = . none, timeStyle: DateIntervalFormatter . Style = . none) {
56- formatter. locale = locale
57- formatter. timeZone = converter. timeZone // important! UTC to UTC
58- formatter. dateStyle = dateStyle
59- formatter. timeStyle = timeStyle
57+ public convenience init ( format: String ) {
58+ self . init {
59+ $0. dateTemplate = format
60+ }
61+ }
62+
63+ public convenience init ( dateStyle: DateIntervalFormatter . Style = . none, timeStyle: DateIntervalFormatter . Style = . none) {
64+ self . init {
65+ $0. dateStyle = dateStyle
66+ $0. timeStyle = timeStyle
67+ }
6068 }
6169
6270 public func string( from start: NaiveDate , to end: NaiveDate ) -> String ? {
63- return converter . dateRange ( from: start, to: end) . map { formatter. string ( from: $0, to: $1) }
71+ return formatter . calendar . _utcDateRange ( from: start, to: end) . map { formatter. string ( from: $0, to: $1) }
6472 }
6573
6674 public func string( from start: NaiveTime , to end: NaiveTime ) -> String ? {
67- return converter . dateRange ( from: start, to: end) . map { formatter. string ( from: $0, to: $1) }
75+ return formatter . calendar . _utcDateRange ( from: start, to: end) . map { formatter. string ( from: $0, to: $1) }
6876 }
6977
7078 public func string( from start: NaiveDateTime , to end: NaiveDateTime ) -> String ? {
71- return converter . dateRange ( from: start, to: end) . map { formatter. string ( from: $0, to: $1) }
79+ return formatter . calendar . _utcDateRange ( from: start, to: end) . map { formatter. string ( from: $0, to: $1) }
7280 }
7381}
7482
7583
7684// MARK: - Private -
7785
78- /// Converts `Naive*` to `Date` in UTC.
79- private final class NaiveDateTimeConverter {
80- private let calendar = Calendar . current
81- let timeZone = TimeZone ( secondsFromGMT: 0 ) !
86+ private extension TimeZone {
87+ static let _utc = TimeZone ( secondsFromGMT: 0 ) !
88+ }
8289
83- func date< T: _DateComponentsConvertible > ( from date: T ) -> Date ? {
84- return calendar. _date ( from: date, in: timeZone)
90+ private extension Calendar {
91+ func _utcDate< T: _DateComponentsConvertible > ( from date: T ) -> Date ? {
92+ return self . _date ( from: date, in: TimeZone . _utc)
8593 }
8694
87- func dateRange < T: _DateComponentsConvertible > ( from start: T , to end: T ) -> ( Date , Date ) ? {
88- guard let start = date ( from: start) , let end = date ( from: end) else { return nil }
95+ func _utcDateRange < T: _DateComponentsConvertible > ( from start: T , to end: T ) -> ( Date , Date ) ? {
96+ guard let start = _date ( from: start) , let end = _date ( from: end) else { return nil }
8997 return ( start, end)
9098 }
9199}
0 commit comments