从NSDate获取NSDate随时区调整

P5y*_*cH0 16 iphone timezone locale nsdate ios

我有一个NSDate对象.我们说它代表"1-10-2011"

NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"];
Run Code Online (Sandbox Code Playgroud)

由于我的时区,该日期转换为"2011-09-30 22:00:00".

问题:如何在当地时区获得表示"2011-10-01 00:00:00"的新Date对象?

Car*_*ona 30

NSDate仅代表绝对时间点.它没有时区或日历的概念.创建NSDate实例时,自2001年1月1日格林威治标准时间起,它只是几秒钟!如果你在纽约,东京,巴塞罗那或耶路撒冷都没关系.

在您的示例中,您基于GMT实例化NSDate,但[date description](用于NSLog)将其转换为您当地的时间.你有不匹配的地方.

因此,有两个部分需要考虑:

1.使用NSCalendar和NSTimeZone创建NSDate

如果您手动创建日期,则应指定日历(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];
Run Code Online (Sandbox Code Playgroud)

此时,日期存储表示当前日历的确切时间点(以秒为单位).

2.使用NSDateFormatter输出NSDate

对于NSDate 的受控输出,您需要NSDateFormatter,用于将日期转换为字符串.

基于Apple NSDateFormatter类参考文档

您可以在样式日期格式器上获取和设置许多属性,但是,我们鼓励您不要更改个别设置.相反,您应该接受在初始化时建立的默认设置,并使用setDateStyle:,setTimeStyle 指定格式:

这对于输出特别重要,输出对于每个语言环境都是不同的.默认情况下,NSDateFormatter会观察当前用户的区域设置.因此,相同的NSDate可以是22.11.2011 18:33:19,或者Nov 22, 2011 6:33:19 PM,2011-11-22 ??6:33:19甚至??-??-???? ?:??:?? ??????全部用于相同的输入和相同的代码.

和代码:

//  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];
Run Code Online (Sandbox Code Playgroud)

或者您可以使用类方法localizedStringFromDate对其进行转换:dateStyle:timeStyle:

我希望这能澄清这个问题.


zap*_*aph 6

[NSDate date] 以GMT格式返回日期.

当你声明:

由于我的时区,该日期转换为"2011-09-30 22:00:00".

是来自NSLogNSDateFormatter?不要依赖[date description]NSLog使用的,它会考虑您当地的时区,使用NSDateFormatter. NSDateFormatter有一个setTimeZone方法.

来自Apple文档[date description]:

不保证表示在操作系统的不同版本中保持不变.要格式化日期,您应该使用日期格式化程序对象