【问题标题】:NSDateFormatter: how to convert date string with 'GMT' to local NSDate?NSDateFormatter:如何将带有“GMT”的日期字符串转换为本地 NSDate?
【发布时间】:2012-11-30 00:36:37
【问题描述】:

我需要将从服务器检索到的日期字符串转换为本地 NSDate,该字符串如下所示:

"Fri, 30 Nov 2012 00:35:18 GMT"

但现在是 11 月 30 日星期五上午 11:36,那么如何将字符串转换为有意义的本地 NSDate?

我找到了:

iPhone: NSDate convert GMT to local time

但看起来恰恰相反。

【问题讨论】:

    标签: objective-c ios nsdate nsdateformatter


    【解决方案1】:

    请注意,NSDate 始终在内部以 GMT 格式存储日期。然后,您使用日期格式化程序在本地时区创建一个字符串。在这种情况下,您从一个字符串开始,因此需要首先使用日期格式化程序创建日期,然后再次使用它在您的本地时区创建一个字符串(它默认为时区不是指定)。

    NSString *dateString           = @"Fri, 30 Nov 2012 00:35:18 GMT";
    
    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    dateFormatter.dateFormat       = @"EEE, dd MM yyyy HH:mm:ss zzz";
    
    NSDate *date                   = [dateFormatter dateFromString:dateString];
    NSString *localDateString      = [dateFormatter stringFromDate:date];
    
    NSLog(@"%@", localDateString);
    // Results:  Thu, 29 11 2012 19:35:18 EST
    

    【讨论】:

    • 糟糕;我的答案有错误的 zeds。 +1。尽管您仍应明确设置语言环境 - 否则 NSDateFormatter 保留修改您的确切格式字符串的权利。
    • @Tommy:如果我没记错的话,语言环境默认为您当前的语言环境。我只是 NSLog'd dateFormatter.locale.localeIdentifier(没有设置它)它给了我“en_US”,这是我当前的语言环境。这就是我没有设置它的原因,因为他希望它在当地时区。
    • @lnafziger 语言环境和时区是独立属性。在使用固定格式的日期/时间字符串时,使用语言环境 en_US_POSIX 很重要。没有它,格式可能会根据用户的 24 小时设置(作为一个示例)在您背后更改。设置区域设置对格式的时区没有影响。请参阅@Tommy 在他的回答中引用的 QA1480。
    • @rmaddy:我不明白你要表达的意思。我创建的日期格式化程序的语言环境默认为en_US。如果我要向用户显示此字符串,我希望它尊重用户的 24 小时设置,以及指定的任何其他内容。当我转换 from 日期格式(如本例中)时,日期格式指定了预期的格式,用户在他的偏好中指定的内容无关紧要......我误解了吗这里有什么??
    • @lnafziger 如果您需要精确的格式,您需要设置 en_US_POSIX 语言环境。创建适应各种设置的用户格式时,请保留默认区域设置。
    【解决方案2】:

    只需将NSDateFormatter 与格式化字符串eee, dd MMM yyyy HH:mm:ss zzz 一起使用。最后的 Zs 导致它从字符串中读取时区。

    所以,给定QA1480,示例代码:

    NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setLocale:usLocale];
    [formatter setDateFormat:@"eee, dd MMM yyyy HH:mm:ss zzz"];
    _createdAt = [formatter dateFromString:dateString];
    

    【讨论】:

    • 在我问题的链接中,他使用了NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; [dateFormatter setTimeZone:gmt];你为什么不需要这个?
    • 您不需要它,因为您的字符串在其中指定了 GMT,并且您设置的日期格式的 zzz 组件将告诉 NSDateFormatter 使用您的字符串指定的内容而不是它指定的任何内容认为规范是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2014-01-06
    • 2020-12-15
    • 2013-01-02
    • 1970-01-01
    • 2014-09-06
    • 2018-12-05
    相关资源
    最近更新 更多