2012-01-31 5 views
6

iOS5シミュレータおよびデバイスでは、NSDateFormatterは "Asia/「z」または「zzz」指定子の場合は「Kolkata」です。NSDateFormatterはGMTオフセット "z"または "zzz"指定子の "Asia/Kolkata"のタイムゾーン省略形を表示しません

NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Kolkata"]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateFormat = @"z"; // or @"zzz" 
dateFormatter.timeZone = timeZone; 

NSLog(@"date string: %@", [dateFormatter stringFromDate:[NSDate date]]); // "GMT+05:30", expected "IST" 
NSLog(@"time zone abbreviation: %@", [timeZone abbreviationForDate:[NSDate date]]); // "IST" 

私は出力に上記のコードを期待:

IST 
IST 

をしかし、それは出力:インドのロケールにロケールを設定する

GMT+05:30 
IST 

EDIT

にはありません助けてくれるようです。

NSLocale *indianEnglishLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_IN"] autorelease]; 
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Kolkata"]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setLocale:indianEnglishLocale]; 
[dateFormatter setDateFormat:@"z"]; // or @"zzz" 
[dateFormatter setTimeZone:timeZone]; 

NSLog(@"date string: %@", [dateFormatter stringFromDate:[NSDate date]]); // "GMT+05:30", expected "IST" 
NSLog(@"time zone abbreviation: %@", [timeZone abbreviationForDate:[NSDate date]]); // "IST" 

私は出力に上記のコードを期待:

IST 
IST 

をしかし、それは出力:

GMT+05:30 
IST 

は、これはバグですか?私は何か間違っているのですか? People have mentioned that NSDateFormatter has bugs, especially when a time zone is specified in the format string. Could this be one of those bugs?

+0

を現代のiOSでの唯一の方法は、日付を使用するために、アップルが推奨することに注意してください。フォーマッタは:https://stackoverflow.com/a/42370648/294884 – Fattie

答えて

13

IOSの5.0の略記時間帯名の解析における変化は、オープンソースICU 4.8ライブラリ (オープンソースCLDR 2.0で意図的変化の結果である

http://www.cocoabuilder.com/archive/cocoa/310977-nsdateformatter-not-working-on-ios-5.html#311281からそれが変更されたバージョン は、NSDateFormatter 機能の一部を実装するために使用されます)。

問題はこれです:Z (= ZZZ)またはV(= VVV)によって指定されるよう短いタイムゾーン形式と、曖昧さの多くが存在することができます。たとえば、 "ET" for Eastern Time "は、異なる地域の多くの 地域で異なるタイムゾーンに適用される可能性があります。書式設定と解析の信頼性を向上させるために、ショートフォームは、" cu "(一般に使用される)フラグ は、そうでない場合は、唯一の長い形態は( フォーマットと解析の両方のために)使用されている。ロケールに設定されている。

「EN」ロケール(=「はen_US」)の場合、Cuのフラグが 例えばmetazonesに設定されていますアラスカ、アメリカ_セントラル、アメリカ_東部、アメリカ_数値、 アメリカ_パシフィック、アトランティック、ハワイ_アウレオーネ、GMTです。ではなく、ヨーロッパ向けです

ただし、 "en_GB"ロケールの場合、cuフラグが Europe_Centralに設定されています。

ので、短い時間帯のスタイル「Z」または「ZZZ」に設定されたフォーマッタとロケール 「エン」または「「en_USのは、」「CEST」または「CET」を解析しませんが、ロケールが代わりに設定 ある場合en_GB "それそれらを解析します。 「GMT」スタイルはすべて になります。

フォーマッタは、それらので、次 のいずれかが、解析され、その後、長い時間帯のスタイル「ZZZZ」に設定し、かつ ロケールが「エン」のいずれかである、「en_USの」、または「表すen_GB」された場合「太平洋夏時間」 「中央ヨーロッパ夏時間」「中部ヨーロッパ時間」

希望があればこれが役立ちます。

  • ピーター・エドバーグ

はい、あなたは正しい、たとえば、あなたが先に提供されている http://www.cocoabuilder.com/archive/cocoa/313301-nsdateformatter-not-working-on-ios-5.html#313301

ヒース、から、 [たDateFormatter stringFromDate:[NSDate日付]] となります。 タイムゾーン名 "IST"を使用してください。これは、 が、現在のOSXおよびiOSリリース(それぞれCLDR 1.9.1および2.0)で のICUで使用されているCLDRデータのバージョンの "en_IN"ロケールデータの不足によるものです。 これらのCLDRバージョンの "en_IN"ロケールは、デフォルトの内容が "en_US"の ベースの "en"ロケールのタイムゾーン名データ を補完しませんでした。

これは数日後にリリースされるCLDR 21リリースではすでに修正されています。 これはICU 49に組み込まれており、将来のOSXおよびiOSリリースの で取り上げられます。

  • ピーターE

---編集---

formatsとそのrulesにユニコードのドキュメントによると、V形式は良い選択だったことがあります。

...同じf ormatをzとして指定します。ただし、[the] commonUsed [flag]の値に関係なく、metazoneタイムゾーンの略語が表示されます。私の場合は

、次のコードのために:

NSLocale *indianEnglishLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_IN"] autorelease]; 
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Kolkata"]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setLocale:indianEnglishLocale]; 
[dateFormatter setDateFormat:@"V"]; 
[dateFormatter setTimeZone:timeZone]; 

NSLog(@"V date string: %@", [dateFormatter stringFromDate:[NSDate date]]); 

私は、次のような出力受信:

V date string: IST 
+2

私は受け取った - これのためにISTの代わりにinccu! – Smitha

+0

Smithaと同じ問題... ISTの代わりにinccuを印刷 – Punita

+1

dateFormatting string ** [dateFormatter setDateFormat:@ "z"]; **とその動作が完全に下になりました。 – Punita

関連する問題