我有一个NSDate对象。假设它代表“1-10-2011”从NSDate获取NSDate随时区调整
NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"];
由于我的时区,该日期转换为“2011-09-30 22:00:00”。
问:如何在本地时区获得代表“2011-10-01 00:00:00”的新Date对象?
我有一个NSDate对象。假设它代表“1-10-2011”从NSDate获取NSDate随时区调整
NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"];
由于我的时区,该日期转换为“2011-09-30 22:00:00”。
问:如何在本地时区获得代表“2011-10-01 00:00:00”的新Date对象?
的NSDate只表示时间的绝对点。它没有时区或日历的概念。当你创建一个NSDate实例时,它仅仅是2001年1月1日以来的秒数!如果你在纽约,东京,巴塞罗那或耶路撒冷,这并不重要。
以您为例,您将根据GMT实例NSDate,但[date description]
(用于NSLog
)将其转换为当地时间。你有错配。
因此有两个部分来考虑:
如果要创建一个日期手动应指定日历的NSDate创建和时区(伦敦时间晚上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];
此时日期存储表示当前日历的确切时间点(以秒为单位)。使用NSDateFormatter
为了您的NSDate的控制输出
基于苹果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:
我希望这个澄清的问题,改造它。
[NSDate date]
以GMT格式返回日期。
当你说出:
这个日期转换为 “2011-09-30 22:00:00”,因为我 时区。
那是从NSLog
还是NSDateFormatter
?不要依赖于NSLog使用的[date description]
,它考虑到你当地的时区,使用NSDateFormatter
。 NSDateFormatter
有一个setTimeZone
方法。
从苹果的文档上[date description]
:
的表示,不能保证保持整个操作系统的 不同版本不变。要格式化的日期,你应该 使用日期格式对象,而不是
尝试\t [df setLocale:[NSLocale currentLocale]]; –