我有一个NSDate对象。假设它代表“1-10-2011”
NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"];
由于我的时区,该日期转换为“2011-09-30 22:00:00”。
问题:如何在当地时区获得代表“2011-10-01 00:00:00”的新Date对象?
答案 0 :(得分:30)
NSDate 仅代表绝对时间点。它没有时区或日历的概念。创建NSDate实例时,自2001年1月1日格林威治标准时间起,它只是几秒钟!如果你在纽约,东京,巴塞罗那或耶路撒冷都没关系。
在您的示例中,您基于GMT实例化NSDate,但[date description]
(在NSLog
中使用)会将其转换为您当地的时间。你有不匹配的地方。
因此需要考虑两个部分:
如果您手动创建日期,则应指定日历(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];
此时,日期存储表示当前日历的确切时间点(以秒为单位)。
对于NSDate的受控输出,您需要 NSDateFormatter ,用于将日期转换为字符串。
基于Apple NSDateFormatter Class Reference文档
您可以在样式日期获取和设置许多属性 格式化程序,... 但是,我们鼓励您不要更改个人设置。相反,你应该接受在初始化时建立的默认设置和使用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];
或者您可以使用类方法localizedStringFromDate:dateStyle:timeStyle:
对其进行转换我希望这能澄清问题。
答案 1 :(得分:6)
[NSDate date]
以GMT格式返回日期。
当你声明:
由于我的原因,该日期转换为“2011-09-30 22:00:00” 时区。
来自NSLog
还是NSDateFormatter
?不要依赖NSLog使用的[date description]
,考虑到您当地的时区,请使用NSDateFormatter
。 NSDateFormatter
有setTimeZone
方法。
来自[date description]
上的Apple文档:
不保证代表性保持不变 不同版本的操作系统。要格式化日期,您 应该使用日期格式化程序对象