2012-01-31 15 views
6

Trên trình mô phỏng và thiết bị iOS5, NSDateFormatter không hiển thị từ viết tắt múi giờ cho "Châu Á/Kolkata "cho" z "hoặc" zzz "specifier.NSDateFormatter không hiển thị chữ viết tắt múi giờ cho "Châu Á/Kolkata" cho thông số "z" hoặc "zzz", chỉ cần bù đắp GMT

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" 

Tôi hy vọng các mã trên để đầu ra:

IST 
IST 

nhưng nó kết quả đầu ra:

GMT+05:30 
IST 

EDIT

Thiết lập miền địa phương đến một miền địa phương Ấn Độ không dường như giúp đỡ.

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" 

Tôi hy vọng các mã trên để đầu ra:

IST 
IST 

nhưng nó kết quả đầu ra:

GMT+05:30 
IST 

Đây có phải là một lỗi? Tôi có làm điều gì sai? 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

Do lưu ý rằng trong iOS hiện đại cách duy nhất khuyến cáo của Apple để sử dụng một ngày trình định dạng là: https://stackoverflow.com/a/42370648/294884 – Fattie

Trả lời

13

Từ http://www.cocoabuilder.com/archive/cocoa/310977-nsdateformatter-not-working-on-ios-5.html#311281

Sự thay đổi trong phân tích cú pháp của tên múi giờ viết tắt trong iOS 5.0 là một kết quả của một sự thay đổi có chủ ý trong các mã nguồn mở ICU 4.8 thư viện (và các mã nguồn mở CLDR 2.0 dữ liệu mà nó sử dụng), một phiên bản sửa đổi được sử dụng để thực hiện một số chức năng NSDateFormatter .

Vấn đề là thế này: Với các định dạng múi giờ ngắn theo quy định của z (= zzz) hoặc v (= vvv), có thể có rất nhiều sự mơ hồ. Ví dụ: "ET" cho Giờ Miền Đông "có thể áp dụng cho các múi giờ khác nhau trong nhiều khu vực khác nhau. được thiết lập cho miền địa phương. Nếu không, chỉ là hình thức lâu được sử dụng (ví cả định dạng và phân tích).

đối với "en" locale (= "en_US"), cờ cu được thiết lập cho metazones như như Alaska, America_Central, America_Eastern, America_Mountain, America_Pacific, Atlantic, Hawaii_Aleutian và GMT. Đây là không phải đặt cho Europe_Central

Tuy nhiên, đối với ngôn ngữ "en_GB", cờ cu được đặt cho Europe_Central. Vì vậy, bộ định dạng được đặt cho kiểu múi giờ ngắn "z" hoặc "zzz" và ngôn ngữ "vi" hoặc "en_" sẽ không phân tích "CEST" hoặc "CET", nhưng nếu ngôn ngữ là thay vào đó được đặt thành " en_GB "it sẽ phân tích cú pháp đó. Kiểu "GMT" sẽ là được phân tích cú pháp.

Nếu định dạng được thiết lập cho phong cách múi giờ dài "zzzz", và locale là bất kỳ "en", "en_US", hoặc "en_GB", sau đó bất kỳ của sau đây sẽ được phân tích, bởi vì họ rõ ràng: "Giờ ban ngày Thái Bình Dương" "Giờ mùa hè Trung Âu" "Giờ Trung Âu" "

Hy vọng điều này sẽ hữu ích.

  • Peter Edberg

Từ http://www.cocoabuilder.com/archive/cocoa/313301-nsdateformatter-not-working-on-ios-5.html#313301

Heath, Vâng, bạn đang đúng, ví dụ như bạn cung cấp ở trên, [dateFormatter stringFromDate: [ngày NSDate]] nên sử dụng tên ngắn hạn múi giờ "IST". Thực tế là nó không phải là do thiếu trong dữ liệu địa phương "en_IN" trong các phiên bản dữ liệu CLDR được ICU sử dụng trong các bản phát hành OSX và iOS hiện tại (tương ứng là CLDR 1.9.1 và 2.0). Ngôn ngữ "en_IN" trong các phiên bản CLDR đó không ghi đè hoặc bổ sung bất kỳ dữ liệu tên múi giờ nào từ miền địa phương "en", có nội dung mặc định là "en_".

Điều này đã được sửa cho bản phát hành CLDR 21 sắp tới trong vài ngày tới. Điều đó đang được tích hợp vào ICU 49 sẽ được chọn trong các bản phát hành OSX và iOS trong tương lai.

  • Peter E

--- Chỉnh sửa ---

Theo tài liệu unicode trên formatsrules của họ, định dạng V có thể là một lựa chọn tốt hơn:

... cùng một f ormat dưới dạng z, ngoại trừ các từ viết tắt múi giờ metazone sẽ được hiển thị nếu có, bất kể giá trị của [the] commonUsed [flag].

Trong trường hợp của tôi, đối với đoạn mã sau:

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]]); 

tôi nhận được kết quả như sau:

V date string: IST 
+2

Tôi đã nhận - inccu thay vì IST cho việc này! – Smitha

+0

Vấn đề tương tự như Smitha ... in inccu thay vì IST – Punita

+1

Tôi đã thử bên dưới chuỗi dateFormatting ** [dateFormatter setDateFormat: @ "z"]; ** và các công trình của nó hoàn hảo. – Punita

Các vấn đề liên quan