将 NSDate 从 UTC 转换为本地给出了错误的结果
Converting NSDate from UTC to local gives wrong result
我正在从小时和分钟的组件创建 NSDate。它是格林威治标准时间并正确打印为:
0001-01-01 07:30:00 +0000
然后我想将其转换为我的本地时区 (CET),所以我像这样设置 NSDateFormatter:
formatter.timeZone = NSTimeZone.localTimeZone()
这会打印(使用 .Longstyle
):
08.13.00 GMT+0.43
这是错误的——它应该是 GMT+1。打印 .localTimeZone()
给出正确的偏移量:
Local Time Zone (Europe/Oslo (CET) offset 3600)
Edit1: 通过将此扩展名(来自评论中链接的答案)添加到 NSDate,我可以手动偏移时区。但是我需要将 NSDateFormatter 时区设置为 GMT,我认为这是不对的。
extension NSDate {
func toLocalTime() -> NSDate {
let timeZone = NSTimeZone.localTimeZone()
let seconds : NSTimeInterval = Double(timeZone.secondsFromGMTForDate(self))
let localDate = NSDate(timeInterval: seconds, sinceDate: self)
return localDate
}
}
Edit2: 我做了一个测试项目。预期的输出是打印时间以匹配时区中的偏移量。相反,它增加了 43 分钟。
func applicationDidFinishLaunching(aNotification: NSNotification) {
let calendar = NSCalendar.currentCalendar()
let realDateComponents = calendar.components([.Hour, .Minute], fromDate: NSDate())
guard let realDate = calendar.dateFromComponents(realDateComponents)
else{fatalError("Unable to get real date.")}
let formatter = NSDateFormatter()
formatter.timeStyle = .ShortStyle
print(realDate)
print(formatter.stringFromDate(realDate))
print(NSTimeZone.localTimeZone())
}
// OUTPUT
0001-01-01 21:03:00 +0000
21.46
Local Time Zone (Europe/Oslo (CET) offset 3600)
NSDate objects encapsulate a single point in time, independent of any
particular calendrical system or time zone. Date objects are
immutable, representing an invariant time interval relative to an
absolute reference date (00:00:00 UTC on 1 January 2001).
显然,您正在从 .Hour
和 .Minute
组件创建日期,将(不确定的)年份信息设置为 01(不是 2001)。
大约 2000 年前的时间点是一个相当大的时间间隔,可能会导致奇怪的行为。
我正在从小时和分钟的组件创建 NSDate。它是格林威治标准时间并正确打印为:
0001-01-01 07:30:00 +0000
然后我想将其转换为我的本地时区 (CET),所以我像这样设置 NSDateFormatter:
formatter.timeZone = NSTimeZone.localTimeZone()
这会打印(使用 .Longstyle
):
08.13.00 GMT+0.43
这是错误的——它应该是 GMT+1。打印 .localTimeZone()
给出正确的偏移量:
Local Time Zone (Europe/Oslo (CET) offset 3600)
Edit1: 通过将此扩展名(来自评论中链接的答案)添加到 NSDate,我可以手动偏移时区。但是我需要将 NSDateFormatter 时区设置为 GMT,我认为这是不对的。
extension NSDate {
func toLocalTime() -> NSDate {
let timeZone = NSTimeZone.localTimeZone()
let seconds : NSTimeInterval = Double(timeZone.secondsFromGMTForDate(self))
let localDate = NSDate(timeInterval: seconds, sinceDate: self)
return localDate
}
}
Edit2: 我做了一个测试项目。预期的输出是打印时间以匹配时区中的偏移量。相反,它增加了 43 分钟。
func applicationDidFinishLaunching(aNotification: NSNotification) {
let calendar = NSCalendar.currentCalendar()
let realDateComponents = calendar.components([.Hour, .Minute], fromDate: NSDate())
guard let realDate = calendar.dateFromComponents(realDateComponents)
else{fatalError("Unable to get real date.")}
let formatter = NSDateFormatter()
formatter.timeStyle = .ShortStyle
print(realDate)
print(formatter.stringFromDate(realDate))
print(NSTimeZone.localTimeZone())
}
// OUTPUT
0001-01-01 21:03:00 +0000
21.46
Local Time Zone (Europe/Oslo (CET) offset 3600)
NSDate objects encapsulate a single point in time, independent of any particular calendrical system or time zone. Date objects are immutable, representing an invariant time interval relative to an absolute reference date (00:00:00 UTC on 1 January 2001).
显然,您正在从 .Hour
和 .Minute
组件创建日期,将(不确定的)年份信息设置为 01(不是 2001)。
大约 2000 年前的时间点是一个相当大的时间间隔,可能会导致奇怪的行为。