我有一个NSDate对象。假设它代表“1-10-2011”

NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"];

由于我所在的时区,该日期会转换为“2011-09-30 22:00:00”。

问题:如何在我的本地时区中获取一个新的Date对象,该对象代表“2011-10-01 00:00:00”?

最佳答案

NSDate 仅代表绝对时间点。它没有时区或日历的概念。创建NSDate实例距格林尼治标准时间2001年1月1日仅几秒钟!无论您在纽约,东京,巴塞罗那还是耶路撒冷,都没关系。

在您的示例中,您基于GMT实例化了NSDate,但是[date description](用于NSLog)将其转换为您的本地时间。那里您不匹配。

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

1.使用NSCalendar和NSTimeZone创建NSDate

如果手动创建日期,则应指定日历(格里高利历为2012,希伯来语为5772)和时区(伦敦时间为22PM,悉尼时间为7AM)。

// 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 ,用于将日期转换为字符串。

基于Apple NSDateFormatter Class Reference文档



这对于输出特别重要,每个输出都不同。默认情况下,NSDateFormatter会观察当前用户的语言环境设置。因此,相同的NSDate可以是22.11.2011 18:33:19Nov 22, 2011 6:33:19 PM2011-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:对其进行转换

我希望这可以解决问题。

关于iphone - 从NSDate获取NSDate,并根据时区进行调整,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7485493/

10-13 04:29