2010-02-28 28 views
6

Tôi đã đọc hướng dẫn DateFormatting và tôi vẫn không thể có trình định dạng hoạt động.NSDate từ NSString

NSString *string = @"0901Z 12/17/09"; 
//This is a sample date. The Z stands for GMT timezone 
//The 0901 is 09h 01m on a 24 hour clock not 12. 
//As long as I can get the hours/min & date from the string I can deal with the time zone later 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"hhmm'Z' MM/dd/yy"]; 
NSDate *date = [dateFormat dateFromString:string]; 

Trả lời

7

Điều đó phù hợp với tôi khi tôi dùng thử. Thêm NSLog(@"%@", date) đến hết mã của bạn mang lại cho tôi kết quả này:

2010-02-28 12:17:22.921 app[9204:a0f] 2009-12-17 09:01:00 -0800 

vấn đề bạn đang nhìn thấy là gì?

Chỉnh sửa: Tôi đã tìm ra, bạn không gặp sự cố với 09:01, nhưng với các giờ 24 giờ khác, như 14:25, phải không? Thay đổi định dạng của bạn để:

@"HHmm'Z' MM/dd/yy" 
+0

Đó là điều 24 giờ nhận được tôi rõ ràng. Cảm ơn. – jamone

1

sao chép từ một câu hỏi tương tự tôi đã trả lời ở đây: NSDateFormatter returns nil for @"dd-MM-yy" in iOS 3.0

Nếu bạn đang làm việc với các ngày sử dụng có thể nhìn thấy, bạn nên tránh thiết lập một chuỗi định dạng ngày tháng. Ngày định dạng theo cách này không thể định vị được và không thể dự đoán chuỗi định dạng của bạn sẽ được thể hiện như thế nào trong tất cả các cấu hình người dùng có thể. Thay vào đó, bạn nên thử và giới hạn bản thân để thiết lập kiểu ngày tháng và thời gian (thông qua - [NSDateFormatter setDateStyle:] và - [NSDateFormatter setTimeStyle:]).

Mặt khác, nếu bạn đang làm việc với ngày định dạng cố định, trước tiên bạn nên đặt ngôn ngữ của trình định dạng ngày thành một cái gì đó phù hợp với định dạng cố định của bạn. Trong hầu hết các trường hợp, ngôn ngữ tốt nhất để chọn là "en_US_POSIX", một ngôn ngữ được thiết kế đặc biệt để mang lại kết quả bằng tiếng Anh Mỹ bất kể sở thích của người dùng và hệ thống. "en_US_POSIX" cũng là bất biến theo thời gian (nếu Hoa Kỳ, tại một thời điểm nào đó trong tương lai, thay đổi cách định dạng ngày, "en_" sẽ thay đổi để phản ánh hành vi mới, nhưng "en_US_POSIX" sẽ không) và giữa các máy ("en_US_POSIX" hoạt động tương tự trên iPhone OS giống như trên Mac OS X, và giống như trên các nền tảng khác).

Khi bạn đã đặt "en_US_POSIX" làm ngôn ngữ của trình định dạng ngày, bạn có thể đặt chuỗi định dạng ngày và trình định dạng ngày sẽ hoạt động nhất quán cho tất cả người dùng.

Thông báo thông tin trên và nhiều hơn nữa có thể được tìm thấy trong của Technical Q&A QA1480

Dưới đây là một đoạn mã từ ứng dụng của tôi mà thực hiện các khuyến nghị trên của Apple:

static NSDateFormatter* dateFormatter = nil; 
if (!dateFormatter) { 
dateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] 
      initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil."); 
[dateFormatter setLocale:enUSPOSIXLocale]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000"; 
} 
Các vấn đề liên quan