我正在使用小时和分钟的组件创建NSDate。它是GMT并正确打印为:
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
}
}
编辑2:我做了一个测试项目。预期输出是打印的时间,以匹配时区中的偏移量。相反,它增加了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)
答案 0 :(得分:1)
NSDate对象封装单个时间点,与any无关 特定的日历系统或时区。日期对象是 不可变的,表示相对于的不变时间间隔 绝对参考日期(2001年1月1日00:00:00 UTC)。
显然,您正在从.Hour
和.Minute
组件创建日期,这会将(不确定)年份信息设置为01(而不是2001年)。
大约2000年前的时间点是一个非常大的时间间隔,可能会导致奇怪的行为。