6

iOS の NSDateFormatter で、シミュレーターと実際のデバイスの両方で Settings/General/International/Calendar が日本語または仏教徒に設定されている場合に問題が発生します。年が正しく解析されていません

DateFormatter

static NSDateFormatter *formatter = nil;  // cache this the first time through


if (formatter == nil) {
    formatter = [NSDateFormatter new];
    formatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; // Fix for QC79748 - Michael Marceau
    formatter.dateFormat = @"EEE, d MMM yyyy HH:mm:ss zzz";
    formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
    formatter.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    formatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]] autorelease];


}

NSLog(@"CorrectDate%@",[serviceHeaders safeObjectForKey:@"Date"] );
    NSLog(@"Formatted date:%@",[formatter dateFromString:[serviceHeaders safeObjectForKey:@"Date"]]);

Output

Correct - Mon, 27 Aug 2012 16:33:14 GMT
Formatted date:0024-08-27 16:33:14 +0000
4

1 に答える 1

4

これは正常に機能しています。コードを取得してプロジェクトに追加し、シミュレーターで仏暦を使用するように設定しました。

NSLog(@"date=%@", [NSDate date]);
2012-08-27 18:42:10.201 Searcher[43537:f803] date=2555-08-27 22:42:10 +0000

    NSDateFormatter *formatter = [NSDateFormatter new];
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; // Fix for QC79748 - Michael Marceau
    formatter.dateFormat = @"EEE, d MMM yyyy HH:mm:ss zzz";
    formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
    formatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    //formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]];

次に、出力:

NSLog(@"CorrectDate%@", @"Mon, 27 Aug 2012 16:33:14 GMT" );
2012-08-27 18:42:10.203 Searcher[43537:f803] CorrectDateMon, 27 Aug 2012 16:33:14 GMT

NSLog(@"Formatted date:%@",[formatter dateFromString:@"Mon, 27 Aug 2012 16:33:14 GMT"]);
2012-08-27 18:42:10.206 Searcher[43537:f803] Formatted date:2555-08-27 16:33:14 +0000

分析:

そのすべてが完璧に機能しています。仏暦では、現在は 2555 年です。グレゴリオ暦の日付を指定し、フォーマッターにグレゴリオ暦を使用するように依頼すると、フォーマッターはそれを適切に読み取り、仏教の日付に変換します。それを印刷すると、日付は再び 2555 になります。まさにあなたが期待するものです。

編集: 要点を押すと、NSDate は常に同じであり、変化するのはその表現です。そこで、カレンダーを再び仏教徒に設定し、フォーマッターを使用してグレゴリオ時間で現在の時刻を取得しました。

NSLog(@"date=%@", [NSDate date]);
NSLog(@"Date using the Gregorian calendar: %@", [formatter stringFromDate:[NSDate date]]);

出力

2012-08-28 07:13:10.658 Searcher[69194:f803] date=2555-08-28 11:13:10 +0000
2012-08-28 07:13:10.660 Searcher[69194:f803] Date using the Gregorian calendar: Tue, 28 Aug 2012 07:13:10 EDT

PS: あなたのコードはロケールを 2 回設定します。

于 2012-08-27T22:48:01.370 に答える