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

Iphone 如何生成以UTC表示当前时间的NSDate对象?,iphone,ios,ipad,nsdate,Iphone,Ios,Ipad,Nsdate,我是iOS新手,我试图了解如何使用日期和格式化程序来创建表示当前时间但在UTC时区的日期对象。也就是说,如果我的设备上的本地时间是太平洋标准时间下午3点,我想创建一个日期对象,表示UTC下午3点的时间。我不想将太平洋标准时间下午3点转换为UTC等效时间,而是使用太平洋标准时间下午3点本地时间日期创建UTC下午3点日期。我现在的代码是 NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; NSDateForm

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

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时间,这是我不想要的。我仍在阅读文档,但我想在此期间我会发布这篇文章。有什么帮助吗


非常感谢你的智慧

您应该让系统为您计算所有日期。自己计算日期可能会导致错误

我们可以使用
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)

你应该让系统为你计算所有的日期。自己计算日期可能会导致错误

我们可以使用
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)


要创建以UTC表示当前时间的NSDate对象,您可以说
[NSDate date]
(请记住,在内部,NSDate始终是UTC(除非您弄糟了)。时区仅涉及通过NSDateFormatter等转换为/从“显示”时间。)(还请记住,NSDate对象不包含任何格式信息。它们只包含相对于GMT/UTC的日期/时间。)UTC和GMT是同一时区。查看文档。顺便说一句,上面的代码要求返回相对于UTC时区的日期。如果您想要PST,您应该请求(或让时区默认值)。要创建以UTC表示当前时间的NSDate对象,可以说
[NSDate date]
(请记住,在内部,NSDate始终是UTC(除非你弄糟了)。时区仅涉及通过NSDateFormatter等转换为/从“显示”时间。)(还请记住,NSDate对象不包含任何格式信息。它们只包含相对于GMT/UTC的日期/时间。)UTC和GMT是同一时区。查看文档。顺便说一句,上面的代码要求返回相对于UTC时区的日期。如果您想要PST,您应该请求(或让时区默认值)。我没有尝试过,但这看起来像是将我的本地时间转换为UTC时间,这不是我要做的。我读对了吗?这会考虑到您当前时间的所有信息,并且只更改时区。这正是您要求的。:)是的,我误读了,我现在明白了。谢谢,MJN,这看起来很棒!不客气!另外,别忘了查看WWDC时间/日期视频。它们非常有趣,并介绍了许多最佳实践。我没有尝试过,但这看起来像是将我的本地时间转换为UTC时间,这不是我想要做的。我读对了吗?这s会记录你当前时间的所有信息,只会更改时区。这正是你所要求的。:)是的,我误读了,我明白了。谢谢,美赞臣,这看起来很棒!不客气!此外,别忘了查看WWDC时间/日期视频。它们非常有趣,并引入了许多最佳实践。