如何生成表示UTC当前时间的NSDate对象?

时间:2013-08-29 18:41:01

标签: iphone ios ipad nsdate

我是iOS新手,我正在尝试了解如何使用日期和格式化程序来创建表示当前时间的日期对象,但是在UTC时区。也就是说,如果我的设备上的本地时间是太平洋标准时间下午3点,我想创建一个日期对象,表示UTC时间下午3点。我不想将太平洋标准时间下午3点转换为UTC等效值,而是使用下午3点的本地时间日期创建下午3点的UTC日期。我目前的代码是......

NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
[dateFormatter setTimeZone:utcTimeZone];
NSString *nowInUTCString = [dateFormatter stringFromDate:[NSDate date]];

...但这实质上将我的本地时间转换为UTC时间,这是我不想要的。我还在阅读文档,但我想我会在此期间发布这篇文章。有什么帮助吗?

非常感谢您的智慧!

1 个答案:

答案 0 :(得分:4)

您应该让系统为您完成所有日期数学运算。自己做日期数学可能会导致错误。

我们可以使用NSCalendar将日期转换为日期组件并返回。 NSDateComponents有一个我们可以设置的时区属性。我们将取回代表它的时区和组件的日期。

// grab the current calendar and date
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];

// create UTC date components
NSDateComponents *utcComponents = [cal components: NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit fromDate: now];
utcComponents.timeZone = [NSTimeZone timeZoneWithName: @"UTC"];

// get the UTC date
NSDate *utcDate = [cal dateFromComponents: utcComponents];

我在太平洋时间并得到以下打印输出。

NSLog(@"%@", utcDate); // 2013-08-29 12:09:52 +0000 (my time converted to UTC)
NSLog(@"%@", now);     // 2013-08-29 19:09:52 +0000 (right now in UTC)