【问题标题】:NSDate - GMT on iPhoneNSDate - iPhone 上的格林威治标准时间
【发布时间】:2011-02-04 14:48:40
【问题描述】:

我在生产应用程序中有以下代码,它根据用户输入的日期计算 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?

【问题讨论】:

    标签: iphone nsdate dst gmt


    【解决方案1】:

    NSDate 使用绝对值的偏移量来表示时间间隔。基准以 GMT 为基准,所有时间间隔均以 GMT 为单位,这就是您看到差异的原因。如果您想要日期的字符串表示形式(例如用于存储在数据库中或其他任何内容中),请使用 NSDateFormatter 在您需要的任何特定时区创建它。

    因此,这将始终为您提供 GMT 日期的字符串表示形式(例如存储在 mysql 中)(包括夏令时):

    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]];
    

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

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

    【讨论】:

    • 您也可以使用 NSDateFormatter 转换为 NSDate:stackoverflow.com/questions/1578577/…
    • @Epsilon Prime:嗯,是的,但他特别询问是否使用日期和时区而不是字符串。我选择这个例子是因为这是人们想要从本地时区转换为另一个时区(如 GMT)的常见原因。
    猜你喜欢
    • 2010-12-02
    • 2013-06-01
    • 2011-05-13
    • 2013-03-10
    • 2011-10-30
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多