Alex Wien接受的答案是不正确的。
默认情况下,NSDateFormatter 将 NSDate 的日期时间值从 UTC 调整为用户的本地时区。为了防止这种调整,告诉 NSDateFormatter 使用时区为UTC
.
要验证结果,请谷歌“当前时间 UTC”。
我下面的源代码应该可以完成这项工作,这意味着在UTC ( Zulu ) 时区中以ISO 8601 格式的字符串形式获取当前日期时间,最后用 a 表示。Z
NSDate* datetime = [NSDate date];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; // Prevent adjustment to user's local time zone.
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSString* dateTimeInIsoFormatForZuluTimeZone = [dateFormatter stringFromDate:datetime];
您可以将此逻辑放在应用程序某处的一对便捷方法中。
- (NSString*)now
{
// Purpose: Return a string of the current date-time in UTC (Zulu) time zone in ISO 8601 format.
return [self toStringFromDateTime:[NSDate date]];
}
……和……</p>
- (NSString*)toStringFromDateTime:(NSDate*)datetime
{
// Purpose: Return a string of the specified date-time in UTC (Zulu) time zone in ISO 8601 format.
// Example: 2013-10-25T06:59:43.431Z
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSString* dateTimeInIsoFormatForZuluTimeZone = [dateFormatter stringFromDate:datetime];
return dateTimeInIsoFormatForZuluTimeZone;
}
使用示例……</p>
NSString* now = [self now];
或者把那些减号变成加号,用作类方法而不是实例方法……</p>
NSString* now = [SomeClassNameHere now];
提示:为了提高人类的可读性,T
请将其格式更改为 SPACE。为了更好地通过软件实现互操作性,请保留T
. ISO 8601 规范允许有空格,但建议保留T
.
提示:我没有测试过,但是……有人说实例化[NSDateFormatter][4]
很昂贵。如果经常这样做(例如在循环中),请考虑缓存单个实例以供重复使用。