iPhone上的NSDate-GMT

iPhone上的NSDate-GMT,iphone,nsdate,dst,gmt,Iphone,Nsdate,Dst,Gmt,我在生产应用程序中有以下代码,它从用户输入的日期计算GMT日期: NSDate *localDate = pickedDate; NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method NSTimeInterval gmtTimeInterval = [localDate timeIn

我在生产应用程序中有以下代码,它从用户输入的日期计算GMT日期:

NSDate *localDate = pickedDate;
    NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];
在上周可怕的夏令时在英国生效之前,该法规一直运作良好


在考虑夏令时的同时,如何将日期转换为GMT?

NSDate使用绝对值的偏移量来表示时间间隔。基准是格林尼治标准时间,所有时间间隔都是格林尼治标准时间,这就是为什么你会看到差异。如果您想要日期的字符串表示形式(如用于存储在数据库中或其他任何地方),请使用NSDateFormatter在您需要的特定时区中创建它

因此,这将始终为您提供一个以GMT表示的日期的字符串表示形式(如存储在mysql中)(考虑到日光节约时间):

这将为您提供正确的日期字符串(以GMT时间为单位),而不考虑本地时区。此外,请记住,您使用NSDate和时间间隔进行的所有相对测量都以GMT为基础。当您将日期格式化程序和日历对象呈现给用户时,或者如果您需要进行日历计算(例如,显示订阅明天到期的警告),请使用日期格式化程序和日历对象将其转换为更有意义的内容


编辑:我忘记添加时区了!如果没有它,格式化程序将使用系统时区。

您也可以使用NSDateFormatter转换为NSDate:@Epsilon Prime:是的,但他特别询问了如何使用日期和时区,而不一定是字符串。我之所以选择这个例子,是因为这是人们希望从一个本地时区转换为另一个时区(如GMT)的常见原因。
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // e.g., set for mysql date strings
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSString* mysqlGMTString = [formatter stringFromDate:[NSDate date]];