NSDate – 将date转换为GMT

我需要能够将NSDate值转换为GMTdate。

我怎么能转换一个NSDate值到GMT格式的NSDate值,独立于iPhone使用的任何date区域设置?

  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm"; NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; [dateFormatter setTimeZone:gmt]; NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]]; [dateFormatter release]; 

在cocoa工作的时间可能会很复杂。 当你得到一个NSDate对象,它在本地时区。 [[NSTimeZone defaultTimeZone] secondsFromGMT]为您提供GMT当前时区的偏移量。 那么你可以这样做:

 NSDate *localDate = // get the date NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset; NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 

现在, gmtDate应该在格林尼治标准时间为您提供正确的date。 为了显示它,看看NSDateFormatter ,特别是setDateStylesetTimeStyle方法。 你创build一个NSDateFormatter ,按照你想要的方式configuration它,然后调用stringFromDate:获得一个很好格式化的string。

霍华德的答案是正确的,请投票并接受。

作为参考,我认为解释date对象和本地化date表示之间的区别是有用的。

在许多编程语言中,date对象用于表示唯一的时间点。 忽略相对论的论点,可以假定,在任何情况下,无论我们如何测量时间,我们都可以定义一个对每一个都相同的时间点。

如果对于每一个时间点我们都可以构build一个独特的标签,那么这个标签可以被传递并且被明确地引用。 date对象的目的是作为特定时间点的唯一通用标签

人们可以拿出任何数量的技术来构build这样的标签scheme,并且每个date对象如何select这样做对使用它们的任何人都是不重要的。

一个例子可能是使用通用事件的数字偏移量( 太阳爆炸后的X秒 )。

只有当我们想把时间点和序列化成人类可读的string,我们必须处理的时区,地区等复杂性…

本地datestring )+( date格式化程序 )=>时间点

时间点+( date格式化程序 )=>( 本地datestring

每个时间点都是普遍的…没有像纽约时间点gmt时间点这样的事情,只有当您将时间点转换为本地string(使用date格式化程序)时才会出现与时区的关联。

注意:我确定有很多关于这个问题的博客/文章,但是在这个小时我的google foo正在让我失望。 如果有人有这个问题的热情,请随时这样做。

虽然Alex的回答是一个好的开始,但它没有处理DST(夏令时),并在参考date添加了不必要的转换。 以下为我工作:

从localDate转换到GMT,考虑到DST:

 NSDate *localDate = <<your local date>> NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:localDate]; NSDate *gmtDate = [localDate dateByAddingTimeInterval:-timeZoneOffset]; // NOTE the "-" sign! 

要将GMTdate转换为localDate,请考虑DST:

 NSDate *gmtDate = <<your gmt date>> NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:gmtDate]; NSDate *localDate = [gmtDate dateByAddingTimeInterval:timeZoneOffset]; 

一个小提示:我使用了dateByAddingTimeInterval,它只是iOS 4。 如果您使用的是OS 3或更早版本,请使用addTimerInterval。

你有没有试过看NSDateFormatter的文档?

NSDateFormatter

NSDateFormatter似乎有一些与时区播放的方法,特别是

-setTimeZone:

我没有自己testing过,但我想象如果将GMT设置为最初在另一个时区显示的date的时区,它将显示具有正确调整的date以匹配新时区。