从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:19Nov 22, 2011 6:33:19 PM2011-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”。

这是从NSLogNSDateFormatter ? 不要依赖[date description]哪个NSLog使用,它会考虑你当地的时区,使用NSDateFormatterNSDateFormatter有一个setTimeZone方法。

从苹果文档[date description]

该表示不保证在操作系统的不同版本中保持不变。 要设置date的格式,应该使用date格式化程序对象