web-dev-qa-db-ja.com

NSDateFormatterとTimeZoneを使用し、GMT時間修飾子を使用せずにNSDateをNSStringに変換する

NSDateFormatterを次のように初期化しています:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss z"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *date = [NSDate date];
NSString *dateString = [dateFormatter stringFromDate:date];

dateStringは次のとおりです:

Thu, 29 Jul 2010 14:58:42 GMT+00:00

「+00:00」を解消したい

http://unicode.org/reports/tr35/tr35-6.html#Time_Zone_Fallback から、ローカライズの問題が発生していると推測しています。現在、「+ 00:00」を手動で削除してこの問題を回避していますが、それは理想的ではありません。

[〜#〜]編集[〜#〜]

NSTimeZoneを作成するためにいくつかの新しい方法を試しましたが、どちらも同じdateStringを生成します。

[NSTimeZone timeZoneWithName:@"GMT"];
[NSTimeZone timeZoneWithName:@"UTC"];
[NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[NSTimeZone timeZoneWithAbbreviation:@"UTC"];
20
Heath Borders

タイムゾーンを表示したくない場合は、フォーマット文字列から末尾の「z」文字を削除してください。

[〜#〜]編集[〜#〜]

一方、タイムゾーン名だけを表示したい場合は、「z」を大文字にします。 ((編集:名前付きタイムゾーンの場合は「z」を小文字のままにします。つまり、PSTと-0800の場合は大文字の「Z」のままにします))

[〜#〜]編集[〜#〜]

小文字の「z」は他のすべてのタイムゾーンで正常に機能しますが、残念ながらGMTは特殊なケースです。したがって、最も簡単な方法は、「z」を省略して、フォーマットされた日付に「GMT」を追加することです。

23
jlehr

受け入れられた回答にはタイプミスがありました。

一方、タイムゾーン名だけを表示したい場合は、「z」を大文字にします。

名前付きタイムゾーンには小文字の「z」、つまりPSTを残し、-0800には大文字の「Z」を残す

    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    [format setDateFormat:@"MMMM dd, yyyy (EEEE) HH:mm:ss z Z"];
    NSDate *now = [NSDate date];
    NSString *nsstr = [format stringFromDate:now];

// 2013年1月23日(水)12:33:46 PST -0800

4
Dickey Singh