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
,特别是setDateStyle
和setTimeStyle
方法。 你创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以匹配新时区。