如何使用NSDateFormatter解析这些时区?

时间:2012-12-27 17:00:32

标签: iphone ios macos nsdate nsdateformatter

我正在解析大量的互联网日期。首先,我尝试使用en_US_POSIX语言环境的格式化程序,然后使用en_GB。代码看起来或多或少像这样:

{
    NSDate *date = [dateString dateWithDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z (zzz)" localeIdentifier:@"en_US_POSIX"];
    if (date) return date;
    date = [dateString dateWithDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z (zzz)" localeIdentifier:@"en_GB"];
    return date;
}

- (NSDate*) dateWithDateFormat:(NSString*)dateFormat localeIdentifier:(NSString*)localeIdentifier
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
    formatter.dateFormat = dateFormat;
    [formatter dateFromString:self];
}

但是,具有以下时区的日期字符串无法解析:

Mon, 16 Jul 2012 12:08:17 +0100 (GMTUK)
Thu, 6 Sep 2012 13:00:06 +0900 (KST)
Wed, 3 Nov 2010 10:12:15 +0100 (Hora est�ndar romance)
Wed, 14 Sep 2011 14:37:35 +0100 (IST)
Wed, 2 May 2012 09:41:06 +0200 (MEST)
Sun, 31 Oct 2010 12:53:06 +0800 (SGT)
Thu, 19 Jan 2012 08:34:44 -0300 (UYT)

我做错了什么?

我是否应该预处理字符串以仅在这些情况下删除时区括号?

1 个答案:

答案 0 :(得分:2)

NSDate可以存储没有时区信息的时间点。由您的软件决定特定的NSDate实例是否以UTC或本地时区存储时间点。在大多数情况下,您希望使用UTC日期。

因此,在解析日期时处理时区差异非常重要。但是不可能记住日期最初的时区(至少不是NSDate个实例)。

所以我建议你在括号中切断时区,然后解析前面的数字时区偏移量。这样,您可以将所有字符串转换为UTC中的NSDate实例,并且解析字符串时不应该有任何问题。

并且日期不应该是(即数字时区偏移的大写Z)?

@"EEE, dd MMM yyyy HH:mm:ss ZZZ"