2011-10-28 45 views
16

thể trùng lặp:
Converting an ISO 8601 timestamp into an NSDate: How does one deal with the UTC time offset?Tại sao NSDateFormatter không thể phân tích ngày từ định dạng ISO 8601

tôi sử dụng đường ray như backend, sản lượng ngày mặc định là 2008-12-29T00: 27: 42-08: 00

Nhưng sau khi nghiên cứu NSDateFormatter của tôi không thể hỗ trợ nó, ngoại trừ tôi thay đổi ngày ra đến 2008-12-29T00: 27: 42-0800

Đây là mã tôi đã sử dụng để phân tích theo tiêu chuẩn ISO 8601 ngày, nhưng nó không hoạt động

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 
NSLog(@"%@", [dateFormatter dateFromString:@"2008-12-29T00:27:42-08:00"]); 

Bất kỳ ý tưởng?

+0

@Ryan Nó biết liên kết này, tôi chỉ muốn có giải pháp tốt hơn. – allenwei

+0

Bạn có tìm thấy giải pháp cho việc này không? Tôi đang tìm một giải pháp có thể cung cấp NSDate hoặc NSString cho một ngày được định dạng là "2008-12-29T00: 27: 42-08: 00". Câu trả lời được chấp nhận không hiệu quả với tôi. Phần có vấn đề là múi giờ tức là "-08: 00". – Mustafa

Trả lời

48

Sự cố xảy ra với múi giờ ở cuối.

Bạn cần có: GMT-0X: 00 hoặc -0X00 không có sự phân biệt giữa giờ và phút.

Hai kết hợp sau đây làm việc:

Combo 1 - sử dụng định dạng giờ (GMT-0X: 00) và ZZZZ

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; 
NSLog(@"DATE FORMAT:%@", [dateFormatter dateFromString:@"2008-12-29T00:27:42GMT-08:00"]); 

Combo 2 - sử dụng RFC 822 định dạng (-0X00) và ZZZ

dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 
NSLog(@"DATE FORMAT:%@", [dateFormatter dateFromString:@"2008-12-29T00:27:42-0800"]); 
+1

Theo http://www.w3.org/TR/NOTE-datetime 2008-12-29T00: 27: 42-08: 00 là định dạng ngày hợp lệ. Tôi có thể thay đổi định dạng mặc định từ Rails phụ trợ, nhưng tôi nghĩ rằng nó không phải là giải pháp tốt. – allenwei

+0

Tôi đã thử giải pháp thứ hai nhưng có sai lầm sai với múi giờ: "DATE ​​FORMAT: 2008-12-29 08:27:42 +0000". "-0800" được chuyển thành "+0000" – JastinBall

+1

, giá trị này trả về 0 khi được sử dụng với 2008-12-29T00: 27: 42Z và đây cũng là ISO8601 http://en.wikipedia.org/wiki/ISO_8601 – AmineG

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