从NSDate获取NSDate与时区调整
我有一个NSDate对象。 假设它代表“1-10-2011”
NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"];
由于我的时区,这个date翻译成“2011-09-30 22:00:00”。
问:如何在当地时区获取代表“2011-10-01 00:00:00”的新Date对象?
NSDate只代表绝对时间点 。 它没有时区或日历的概念。 当你创build一个NSDate实例时,只需要2001年1月1日以后的几秒钟! 如果你在纽约,东京,巴塞罗那或耶路撒冷,这并不重要。
在你的例子中,你基于GMT实例化了NSDate,但是[date description]
(在NSLog
)将它翻译成你的本地时间。 在那里你有错配。
所以有两个部分需要考虑:
1.使用NSCalendar和NSTimeZone创buildNSDate
如果您要手动创builddate,则应指定日历(格里高利2012年,希伯来语5772年)和时区(伦敦时间晚上22点,悉尼时间上午7点)。
// Use the user's current calendar and time zone NSCalendar *calendar = [NSCalendar currentCalendar]; [calendar setTimeZone: [NSTimeZone systemTimeZone]]; // Specify the date components manually (year, month, day, hour, minutes, etc.) NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init]; [timeZoneComps setHour:22]; [timeZoneComps setMinute:0]; [timeZoneComps setSecond:0]; // ... year, month, ... // transform the date compoments into a date, based on current calendar settings NSDate *date = [calendar dateFromComponents:timeZoneComps];
此时,存储代表当前日历的确切时间点(以秒为单位)。
2.使用NSDateFormatter的NSDate输出
对于NSDate的受控输出 ,您需要NSDateFormatter ,它用于将date转换为string。
基于Apple NSDateFormatter类参考文档
有很多属性可以在样式date格式化程序中获得和设置,但是,鼓励您不要更改个别设置 。 相反,您应该接受在初始化时build立的默认设置,并使用setDateStyle :, setTimeStyle 指定格式 :
这对于输出来说是特别重要的,对于每个地区来说都是不同的。 默认情况下,NSDateFormatter会观察当前用户的区域设置。 所以相同的NSDate可能是22.11.2011 18:33:19
或Nov 22, 2011 6:33:19 PM
或2011-11-22 下午6:33:19
或甚至२२-११-२०११ ६:३३:१९ अपराह्
,全部用于相同的input和相同的代码。
和代码:
// NSDate *date -> NSString *dateString NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; // Medium style date, short style time => "Nov 23, 1937 3:30pm" NSString *dateString = [dateFormatter stringFromDate:date];
或者你可以使用类方法localizedStringFromDate来转换它:dateStyle:timeStyle:
我希望能够澄清这个问题。
[NSDate date]
以GMT [NSDate date]
返回date。
当你陈述:
由于我的时区,这个date翻译成“2011-09-30 22:00:00”。
这是从NSLog
或NSDateFormatter
? 不要依赖[date description]
哪个NSLog使用,它会考虑你当地的时区,使用NSDateFormatter
。 NSDateFormatter
有一个setTimeZone
方法。
从苹果文档[date description]
:
该表示不保证在操作系统的不同版本中保持不变。 要设置date的格式,应该使用date格式化程序对象