2015-09-19 22 views
8

Một trong các ứng dụng của tôi gặp sự cố sau khi chạy trên thiết bị vừa nâng cấp lên iOS9 (mục tiêu của ứng dụng là 8.1).NSDateFormatter.dateFromString đang trả về null sau khi nâng cấp iOS9

Ứng dụng hoạt động tốt trên iOS9 trước, tuy nhiên, sau khi CHỈ nâng cấp lên iOS9 trên thiết bị, sự cố sau xảy ra.

Biến bên dưới được gọi là 'anObsDate' hiện trả về giá trị rỗng. Tôi không biết tại sao. Có vẻ như bản nâng cấp độc lập của iOS9 trên thiết bị chủ đã kích hoạt sự cố này xảy ra.

NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

Khi tôi chạy ứng dụng với debug sau, chúng tôi có sản lượng này:

 NSLog(@"Timestamp %@", [anObs timeStamp]); 
    NSLog(@"Formatter %@", [self bomDateFormatter]); 
    NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

Timestamp 2015-09-17 00:01:10 
Formatter <NSDateFormatter: 0x7fe7abc653c0> 

tôi đặt định dạng ngày của tôi như sau:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]; 
NSDateFormatter *countDownFormatter = [[NSDateFormatter alloc] init]; 
[countDownFormatter setLocale:locale]; 
[countDownFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Melbourne"]]; 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss"]; 
return countDownFormatter; 

lần nữa để làm điều này rõ ràng , nếu tôi chạy ứng dụng của mình trên thiết bị iOS9 trước, mọi thứ hoạt động tốt và dateFromString trả về một NSDate. Sau khi nâng cấp lên phiên bản iOS9 dateFromString trả về giá trị rỗng.

Mọi đề xuất?

Cảm ơn.

Trả lời

6

Có vẻ như NSDateFormatter đã thay đổi về hành vi trong iOS 9 sao cho các ký tự được trích dẫn trong định dạng ngày phải khớp chính xác với các ký tự trong chuỗi. Trước đây nó sẽ chấp nhận bất kỳ ký tự nào (tìm kiếm tài liệu, nhưng không thể tìm thấy bất kỳ đề cập nào về thay đổi này).

Chuỗi dấu thời gian bị thiếu "T" được xác định theo định dạng ngày. Hãy thử thay đổi định dạng ngày tháng của bạn để:

// Note the "T" has been removed 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss"]; 

tùy chọn khác của bạn sẽ có thêm chữ "T" vào chuỗi timestamp:

// Note the "T" has been added 
2015-09-17T00:01:10 

này cần được tương thích ngược với các phiên bản trước của iOS.

+0

điểm trên. Tôi đã xóa 'T' khỏi định dạng ngày của tôi và đã khắc phục sự cố. Tuy nhiên, tôi không nên mong đợi tôi cần làm điều này với bản cập nhật iOS độc lập. – ack

+0

Đồng ý. Có lẽ xứng đáng với một báo cáo lỗi cho Apple. – ospr

+2

Apple đã nhắc tôi rằng các ngôn ngữ như 'en_AU' là cấu trúc người dùng đối mặt và chúng * thay đổi thường xuyên *. Ví dụ, một số thời gian khoảng năm 1966, en_AU thay đổi từ làm việc với “£” để làm việc với “$”. Chuỗi định dạng ngày không đảm bảo sự ổn định ở ngôn ngữ hướng đến người dùng. Họ khuyên bạn nên sử dụng en_US_POSIX, được cho là một miền địa phương cố định không bao giờ thay đổi. Tuy nhiên, vấn đề tôi báo cáo ở trên vẫn tồn tại với en_US_POSIX ... Thực tế là một NSDate hợp lệ đã được trả lại khi trình định dạng chuỗi và chuỗi không khớp với chính nó là lỗi; dường như đã được sửa ở iOS9. – ack

3

Điều này được giải quyết vấn đề của tôi. Bạn cũng có thể sử dụng nó.

Trong Objective C:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 

Trong Swift:

let dateFormatter = NSDateFormatter()  
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
Các vấn đề liên quan