NSCalendar dateFromComponents:GMT时区而不是systemTimeZone
这段代码
NSCalendar *calendar =[NSCalendar currentCalendar]; [gregorian setTimeZone:tz]; NSLog(@"%@", [gregorian timeZone]); NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[NSDate date]]; [comp setDay:info.day]; [comp setMonth:info.month]; [comp setYear:info.year]; [comp setHour:info.hour]; [comp setMinute:info.minute]; [comp setSecond:info.second]; [comp setTimeZone:tz]; NSLog(@"%@", [comp timeZone]); NSLog(@"%@", [gregorian dateFromComponents:comp]);
在控制台中显示以下内容:
Europe/Moscow (MSKS) offset 14400 (Daylight) Europe/Moscow (MSKS) offset 14400 (Daylight) 2011-08-31 20:00:00 +0000
因此,正确指定了日历和组件的时区,但[gregorian dateFromComponents:comp]
返回带有错误时区(GMT)的NSDate值。
我需要纠正什么才能获得合适的时区?
您看到的输出完全正常。 如果您直接NSLog一个NSDate
对象,您将获得description
方法返回的任何内容,这是日期的GMT表示(但不是刻在石头上)。
NSDate
对象不受时区限制。 NSDate
表示从参考日期开始测量的绝对时间。 例如,在撰写本文时,当前日期类似于337035053.199801
(自参考日期起的秒数),可以表示为2011-09-06 20:50:53 GMT
或2011-09-06 22:50:53 CEST
。 两者都是同一日期的不同人类可读表示。
总之,你需要什么来获得合适的时区? 您需要使用NSDateFormatter
在您喜欢的任何时区获取NSDate
的字符串表示。
这个问题经常出现,答案是使用NSDateFormatter
来获取日期格式的所需输出。 目前,它始终使用GMT时区打印。 以下是NSDate
文档的讨论:
讨论
不保证表示在操作系统的不同版本中保持不变。 要格式化日期,您应该使用日期格式化程序对象(请参阅NSDateFormatter和数据格式指南)