2

iOS iPhone アプリには、iOS 5 でresultDateという名前の有効な NSDate オブジェクトを生成する次のコードが含まれています。

    static NSDateFormatter *invariantFmt = nil;
    if (!invariantFmt) {
        invariantFmt = [[NSDateFormatter alloc] init];
        NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
        [invariantFmt setLocale:locale];
        [locale release];
        [invariantFmt setDateStyle:NSDateFormatterShortStyle];
        [invariantFmt setTimeStyle:NSDateFormatterMediumStyle];
    }
    NSDate *resultDate = [invariantFmt dateFromString:@"08/04/2010 10:43:39 AM"];

XCode 4.6 および iOS 6.1 にアップグレードした後、そのコードは resultDate に nil を返すようになったため、解析に使用するものが変更されました。リリース ノートには、NSDateFormatter の変更については何も書かれていません。インターネット調査によると、より新しい Unicode UTS Locale 解析標準を使用するように変更された可能性があるということだけが明らかになりました。明らかに彼らは何かを変えました。コードをいじり、既知の有効な NSDate オブジェクトを取得し、同じ NSDateFormatter 設定を適用して NSString を取得した後、iOS 6.1 が代わりにこの文字列を好むことがわかりました: @"08/04/2010, 10:43:39 AM"

唯一の違いは、日付部分の後の余分なコンマです。iOS 6.1 でそれを使用すると、上記と同じコードで有効な日付が返されます。これを見て、なぜそれが違うのか、それとも Unicode の変更なのか、それとも Apple のバグなのかを理解している人はいますか?

4

2 に答える 2

1

書式スタイルは、NSDateオブジェクトをテキストに変換してユーザーに表示する場合にのみ使用してください。日付文字列を既知の形式で解析する場合は、スタイルではなく、特定の形式を使用する必要があります。ロケールの使用は、en_US_POSIX指定した形式が 24 時間制の設定などのユーザー設定に基づいて OS によって微調整されないようにするために使用されます。

したがって、ご想像のとおり、日付と時刻のスタイルを設定する 2 つの呼び出しを削除し、解析する必要がある既知の日付/時刻文字列に一致する特定の形式を設定する呼び出しに置き換える必要があります。

于 2013-02-08T15:42:09.507 に答える