2010-01-25 26 views
39

Tôi có đồng hồ đếm ngược đếm ngược từ ngày/giờ hiện tại đến ngày/giờ cụ thể trong tương lai. Nó hoạt động tốt ngoại trừ một vấn đề. Tôi nhập ngày tương lai bằng cách sử dụng NSDateFormatter và dateFromString. Nó dường như không thể chấp nhận bất kỳ thời gian (giờ) trên 12 mặc dù chỉ ra nó không hỗ trợ 24 giờ đồng hồ. Có cách nào để kích hoạt hỗ trợ đồng hồ 24 giờ hoặc giải pháp thay thế không? Dưới đây là một số mã của tôi:NSDateFormatter với 24 giờ

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 

Cảm ơn

+0

nội dung bản địa hóa ...? không phải bạn đã bản địa hoá 'NSDateFormatter' đúng cách đầu tiên? – holex

Trả lời

63

NSDateFormatter theo Unicode standard for date and time patterns. Sử dụng 'H' cho giờ trên đồng hồ 24 giờ:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 
+37

Tính năng này không hoạt động nếu người dùng đặt 24 giờ thành tắt. –

+4

Đáng kinh ngạc phải không? Tôi chỉ tìm thấy một trong những ứng dụng của riêng tôi đã thất bại bởi vì mặc dù sử dụng HH trong một chuỗi định dạng, thiết lập người dùng ghi đè điều này. Khùng! – Roger

+1

Câu trả lời này gây hiểu lầm. Tôi đồng ý với Mavrick3 và Roger. Cài đặt người dùng ghi đè HH của mẫu thời gian chuẩn. Định dạng ngày Tài liệu, gợi ý khó chịu về hành vi này: Trong mọi trường hợp, bạn nên xem xét định dạng mặc định để sử dụng ngôn ngữ của người dùng (currentLocale) chồng lên với cài đặt tùy chọn của người dùng. – user363349

49

Tôi đã gặp vấn đề tương tự và chỉ sử dụng HH làm việc trên một số thiết bị, như Roger cũng đã xác minh. Cuối cùng, đây là giải pháp làm việc cho tôi, tôi hy vọng nó có tác dụng cho người khác. Tìm câu trả lời này là khó khăn, không có diễn đàn với nó, nó đã được nghĩa đen thử nghiệm và lỗi theo tài liệu hướng dẫn táo.

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

    [dateFormatter setLocale:enUSPOSIXLocale]; 

    NSString *dateFormat = @"dd/mm/yyyy HH:mm"; 

    [dateFormatter setDateFormat:dateFormat]; 
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
    date = [dateFormatter dateFromString:string]; 
+0

cảm ơn, bạn đời. đã làm các trick. – Felipe

+0

Cho đến nay điều này đang hoạt động hoàn hảo. Cảm ơn. – vaticRite

+0

Điều đó phải được đánh dấu là câu trả lời. Điều này hoàn toàn hoạt động. – aramusss

2

Tôi đã có một vấn đề tương tự gần đây, thay vì HH, NSDateFormatter lờ hh, a (AM/PM Symbol) và G (tên thời cyclic) trong ứng dụng của tôi.

Và tôi đã rất ngạc nhiên khi thấy rằng nếu tôi đi đến cài đặt bản địa hóa thiết bị của tôi và thực hiện một số lựa chọn ngẫu nhiên, tất cả các freak đã biến mất và lỗi không thể được tạo lại. Rất kì lạ.

Sau đó, tôi đã thử nghiệm trên trình mô phỏng để thực hiện một số nghiên cứu về nó. Có giải pháp của tôi:

Sau khi bạn tạo NSDateFormatter, hãy đặt rõ ràng thuộc tính miền ngay cả khi bạn đang sử dụng ngôn ngữ hiện tại, quan trọng hơn, KHÔNG sử dụng [NSLocale currentLocale], cái này bị lỗi và có thể bằng cách nào đó "ghi đè" , sử dụng systemLocale hoặc tạo rõ ràng một phiên bản NSLocale bằng cách sử dụng một định danh ngôn ngữ.

6

Giải pháp của tôi trên Swift:

let formatter = NSDateFormatter() 
var defIdentifer = formatter.locale.localeIdentifier 
if !defIdentifer.hasSuffix("_POSIX") { 
    defIdentifer = defIdentifer+"_POSIX" 
    let locale = NSLocale(localeIdentifier: defIdentifer) 
    formatter.locale = locale 
} 
formatter.dateFormat = "HH:mm" 
+0

Câu trả lời chính xác! Đó là những gì tôi đang tìm kiếm. – Rados

4

Taken từ Apple Technical Q&A trên NSDateFormatters

Hỏi: Tôi đang sử dụng NSDateFormatter để phân tích một ngày Internet phong cách, nhưng điều này không cho một số người dùng trong một số khu vực. Tôi đã đặt một chuỗi định dạng ngày cụ thể; không nên ép buộc NSDateFormatter hoạt động độc lập với cài đặt vùng của người dùng?

A: Không. Trong khi thiết lập chuỗi định dạng ngày sẽ xuất hiện để hoạt động với hầu hết người dùng, đó không phải là giải pháp phù hợp cho vấn đề này. Có nhiều nơi mà chuỗi định dạng hoạt động theo những cách bất ngờ.

Đây là cách tôi đã làm mỏ Swift:

private let dateFormatter: NSDateFormatter = { 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
    dateFormatter.timeZone = NSTimeZone.init(forSecondsFromGMT: 0) 
    return dateFormatter 
}() 
+0

Cảm ơn anh chàng. Nó hoạt động rất tốt !!! –

0

phiên bản C Mục tiêu của việc NSDate từ chuỗi 24 giờ khi dùng đã thiết lập định dạng 12 giờ trên iPhone của họ mà không thay đổi vị trí và thiết lập múi giờ :

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSString *localeId = dateFormatter.locale.localeIdentifier; 
if (! [localeId hasSuffix:@"_POSIX"]) { 
    localeId = [localeId stringByAppendingString:@"_POSIX"]; 
    dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:localeId]; 
} 
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH.mm.ss"; 

NSDate *date = [dateFormatter dateFromString:dateText]; 
Các vấn đề liên quan