@@ -79,10 +79,27 @@ open class NSTimeZone : NSObject, NSCopying, NSSecureCoding, NSCoding {
79
79
_CFDeinit ( self )
80
80
}
81
81
82
+ // `init(forSecondsFromGMT:)` is not a failable initializer, so we need a designated initializer that isn't failable.
83
+ internal init ( _name tzName: String ) {
84
+ super. init ( )
85
+ _CFTimeZoneInit ( _cfObject, tzName. _cfObject, nil )
86
+ }
87
+
82
88
// Time zones created with this never have daylight savings and the
83
89
// offset is constant no matter the date; the name and abbreviation
84
90
// do NOT follow the POSIX convention (of minutes-west).
85
- public convenience init ( forSecondsFromGMT seconds: Int ) { NSUnimplemented ( ) }
91
+ public convenience init ( forSecondsFromGMT seconds: Int ) {
92
+ let sign = seconds < 0 ? " - " : " + "
93
+ let absoluteValue = abs ( seconds)
94
+ var minutes = absoluteValue / 60
95
+ if ( absoluteValue % 60 ) >= 30 { minutes += 1 }
96
+ var hours = minutes / 60
97
+ minutes %= 60
98
+ hours = min ( hours, 99 ) // Two digits only; leave CF to enforce actual max offset.
99
+ let mm = minutes < 10 ? " 0 \( minutes) " : " \( minutes) "
100
+ let hh = hours < 10 ? " 0 \( hours) " : " \( hours) "
101
+ self . init ( _name: " GMT " + sign + hh + mm)
102
+ }
86
103
87
104
public convenience init ? ( abbreviation: String ) {
88
105
let abbr = abbreviation. _cfObject
@@ -95,7 +112,7 @@ open class NSTimeZone : NSObject, NSCopying, NSSecureCoding, NSCoding {
95
112
open func encode( with aCoder: NSCoder ) {
96
113
if aCoder. allowsKeyedCoding {
97
114
aCoder. encode ( self . name. _bridgeToObjectiveC ( ) , forKey: " NS.name " )
98
- // darwin versions of this method can and will encode mutable data, however it is not required for compatability
115
+ // Darwin versions of this method can and will encode mutable data, however it is not required for compatibility
99
116
aCoder. encode ( self . data. _bridgeToObjectiveC ( ) , forKey: " NS.data " )
100
117
} else {
101
118
}
@@ -165,58 +182,47 @@ open class NSTimeZone : NSObject, NSCopying, NSSecureCoding, NSCoding {
165
182
166
183
extension NSTimeZone {
167
184
168
- open class func systemTimeZone ( ) -> TimeZone {
185
+ open class var system : TimeZone {
169
186
return CFTimeZoneCopySystem ( ) . _swiftObject
170
187
}
171
188
172
189
open class func resetSystemTimeZone( ) {
173
190
CFTimeZoneResetSystem ( )
174
191
}
175
192
176
- open class func defaultTimeZone( ) -> TimeZone {
177
- return CFTimeZoneCopyDefault ( ) . _swiftObject
178
- }
179
-
180
- open class func setDefaultTimeZone( _ aTimeZone: TimeZone ) {
181
- CFTimeZoneSetDefault ( aTimeZone. _cfObject)
193
+ open class var `default` : TimeZone {
194
+ get {
195
+ return CFTimeZoneCopyDefault ( ) . _swiftObject
196
+ }
197
+ set {
198
+ CFTimeZoneSetDefault ( newValue. _cfObject)
199
+ }
182
200
}
183
- }
184
201
185
- extension NSTimeZone : _SwiftBridgable , _CFBridgable {
186
- typealias SwiftType = TimeZone
187
- var _swiftObject : TimeZone { return TimeZone ( reference: self ) }
188
- }
189
-
190
- extension CFTimeZone : _SwiftBridgable , _NSBridgable {
191
- typealias NSType = NSTimeZone
192
- var _nsObject : NSTimeZone { return unsafeBitCast ( self , to: NSTimeZone . self) }
193
- var _swiftObject : TimeZone { return _nsObject. _swiftObject }
194
- }
202
+ open class var local : TimeZone { NSUnimplemented ( ) }
195
203
196
- extension TimeZone : _NSBridgable , _CFBridgable {
197
- typealias NSType = NSTimeZone
198
- typealias CFType = CFTimeZone
199
- var _nsObject : NSTimeZone { return _bridgeToObjectiveC ( ) }
200
- var _cfObject : CFTimeZone { return _nsObject. _cfObject }
201
- }
204
+ open class var knownTimeZoneNames : [ String ] {
205
+ guard let knownNames = CFTimeZoneCopyKnownNames ( ) else { return [ ] }
206
+ return knownNames. _nsObject. _bridgeToSwift ( ) as! [ String ]
207
+ }
202
208
203
- extension NSTimeZone {
204
- open class func localTimeZone( ) -> TimeZone { NSUnimplemented ( ) }
205
-
206
- open class var knownTimeZoneNames : [ String ] { NSUnimplemented ( ) }
207
-
208
209
open class var abbreviationDictionary : [ String : String ] {
209
210
get {
210
- NSUnimplemented ( )
211
+ guard let dictionary = CFTimeZoneCopyAbbreviationDictionary ( ) else { return [ : ] }
212
+ return dictionary. _nsObject. _bridgeToSwift ( ) as! [ String : String ]
211
213
}
212
214
set {
215
+ // CFTimeZoneSetAbbreviationDictionary(newValue._cfObject)
213
216
NSUnimplemented ( )
214
217
}
215
218
}
216
-
219
+
217
220
open class var timeZoneDataVersion : String { NSUnimplemented ( ) }
218
-
219
- open var secondsFromGMT : Int { NSUnimplemented ( ) }
221
+
222
+ open var secondsFromGMT : Int {
223
+ let currentDate = Date ( )
224
+ return secondsFromGMT ( for: currentDate)
225
+ }
220
226
221
227
/// The abbreviation for the receiver, such as "EDT" (Eastern Daylight Time). (read-only)
222
228
///
@@ -226,15 +232,52 @@ extension NSTimeZone {
226
232
return abbreviation ( for: currentDate)
227
233
}
228
234
229
- open var daylightSavingTime : Bool { NSUnimplemented ( ) }
230
- open var daylightSavingTimeOffset : TimeInterval { NSUnimplemented ( ) }
231
- /*@NSCopying*/ open var nextDaylightSavingTimeTransition : Date ? { NSUnimplemented ( ) }
232
-
235
+ open var isDaylightSavingTime : Bool {
236
+ let currentDate = Date ( )
237
+ return isDaylightSavingTime ( for: currentDate)
238
+ }
239
+
240
+ open var daylightSavingTimeOffset : TimeInterval {
241
+ let currentDate = Date ( )
242
+ return daylightSavingTimeOffset ( for: currentDate)
243
+ }
244
+
245
+ /*@NSCopying*/ open var nextDaylightSavingTimeTransition : Date ? {
246
+ let currentDate = Date ( )
247
+ return nextDaylightSavingTimeTransition ( after: currentDate)
248
+ }
249
+
233
250
open func isEqual( to aTimeZone: TimeZone ) -> Bool {
234
251
return CFEqual ( self . _cfObject, aTimeZone. _cfObject)
235
252
}
236
-
237
- open func localizedName( _ style: NameStyle , locale: Locale ? ) -> String ? { NSUnimplemented ( ) }
253
+
254
+ open func localizedName( _ style: NameStyle , locale: Locale ? ) -> String ? {
255
+ #if os(OSX) || os(iOS)
256
+ let cfStyle = CFTimeZoneNameStyle ( rawValue: style. rawValue) !
257
+ #else
258
+ let cfStyle = CFTimeZoneNameStyle ( style. rawValue)
259
+ #endif
260
+ return CFTimeZoneCopyLocalizedName ( self . _cfObject, cfStyle, locale? . _cfObject ?? CFLocaleCopyCurrent ( ) ) . _swiftObject
261
+ }
262
+
263
+ }
264
+
265
+ extension NSTimeZone : _SwiftBridgable , _CFBridgable {
266
+ typealias SwiftType = TimeZone
267
+ var _swiftObject : TimeZone { return TimeZone ( reference: self ) }
268
+ }
269
+
270
+ extension CFTimeZone : _SwiftBridgable , _NSBridgable {
271
+ typealias NSType = NSTimeZone
272
+ var _nsObject : NSTimeZone { return unsafeBitCast ( self , to: NSTimeZone . self) }
273
+ var _swiftObject : TimeZone { return _nsObject. _swiftObject }
274
+ }
275
+
276
+ extension TimeZone : _NSBridgable , _CFBridgable {
277
+ typealias NSType = NSTimeZone
278
+ typealias CFType = CFTimeZone
279
+ var _nsObject : NSTimeZone { return _bridgeToObjectiveC ( ) }
280
+ var _cfObject : CFTimeZone { return _nsObject. _cfObject }
238
281
}
239
282
240
283
extension NSTimeZone {
@@ -249,3 +292,7 @@ extension NSTimeZone {
249
292
}
250
293
251
294
}
295
+
296
+ extension NSNotification . Name {
297
+ public static let NSSystemTimeZoneDidChange = NSNotification . Name ( rawValue: " NSSystemTimeZoneDidChangeNotification " ) // NSUnimplemented
298
+ }
0 commit comments