0

多数のインターネット日付を解析しています。en_US_POSIX最初にlocale でフォーマッタを試し、次に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)

私は何を間違っていますか?

これらの場合にのみ、文字列を前処理してタイム ゾーンの括弧を削除する必要がありますか?

4

1 に答える 1

2

NSDateタイムゾーン情報なしで特定の時点を保存できます。NSDate特定のインスタンスが特定の時点を UTC で保存するか、ローカル タイム ゾーンで保存するかは、ソフトウェア次第です。ほとんどの場合、UTC 日付を使用します。

そのため、日付を解析するときにタイム ゾーンの違いを処理することが重要です。ただし、日付が最初にあったタイムゾーンを思い出すことはできません (少なくともNSDateインスタンスのみでは)。

そのため、括弧内のタイム ゾーンを切り取り、その前の数値タイム ゾーン オフセットのみを解析することをお勧めします。そうすれば、すべての文字列を UTC のインスタンスに変換できNSDate、文字列の解析で問題が発生することはありません。

そして、日付 ​​fromat は (つまり、数字のタイム ゾーン オフセットの場合は大文字の Z) べきではありませんか?

@"EEE, dd MMM yyyy HH:mm:ss ZZZ"
于 2012-12-27T17:57:06.193 に答える