2012-08-31 76 views
5

Tôi đang sử dụng UIDatePicker để chọn thời gian. Tôi cũng tùy chỉnh nền của bộ chọn, tuy nhiên tôi cần 2 hình ảnh khác nhau tùy thuộc vào việc người dùng đang sử dụng chế độ 12 giờ (hiển thị cột AM/PM) hay chế độ 24 giờ. Làm cách nào để tôi có thể phát hiện cài đặt người dùng trong thời gian 12/24 giờ?Phát hiện cài đặt thời gian iPhone 24 giờ

Cảm ơn

Trả lời

3

và có lẽ nhiều, nhiều hơn nữa ...

+0

Wow, cảm ơn. Tôi đã thực hiện tìm kiếm trên Google thường hiển thị kết quả Stack Overflow nhưng tôi đã hoàn toàn trống! – Darren

31

Thậm chí ngắn hơn so với những người khác:

NSString *format = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]]; 
BOOL is24Hour = ([format rangeOfString:@"a"].location == NSNotFound); 

Giải thích

Nhân vật chuỗi định dạng để đại diện cho biểu tượng sáng/chiều là "a", như tài liệu trong Unicode Locale Markup Language – Part 4: Dates.

Cùng một tài liệu cũng giải thích các mẫu biểu tượng đặc biệt "j":

Đây là một biểu tượng đặc biệt mục đích. Nó không được xuất hiện trong dữ liệu mẫu hoặc khung. Thay vào đó, nó được dành riêng để sử dụng trong các bộ xương được truyền cho các API làm việc tạo mô hình ngày tháng linh hoạt. Trong bối cảnh như vậy, nó yêu cầu định dạng giờ ưa thích cho ngôn ngữ (h, H, K hoặc k), được xác định bằng cách sử dụng định dạng h, H, K hoặc k trong định dạng thời gian ngắn chuẩn cho ngôn ngữ. Khi triển khai API như vậy, 'j' phải được thay thế bằng h, H, K hoặc k trước khi bắt đầu trận đấu với dữ liệu availableFormats. Lưu ý rằng việc sử dụng 'j' trong một bộ xương được chuyển đến một API là cách duy nhất để yêu cầu bộ xương yêu cầu loại chu kỳ thời gian ưa thích của một miền địa phương (12 giờ hoặc 24 giờ).

Các NSString phương pháp dateFormatFromTemplate:options:locale: được mô tả trong NSDateFormatter documentation của Apple:

Trả về một chuỗi định dạng ngày tháng địa phương đại diện cho các định dạng các thành phần ngày đã cho bố trí hợp lý cho các địa phương quy định.

Vì vậy, phương pháp đó sẽ làm là biến @"j" bạn chuyển vào làm mẫu trong chuỗi định dạng phù hợp với NSDateFormatter. Nếu chuỗi này chứa biểu tượng am/pm @"a" ở bất kỳ đâu, thì bạn biết ngôn ngữ (và các cài đặt người dùng khác đang được hệ điều hành thẩm vấn cho bạn) muốn hiển thị am/pm.

+0

Tôi đã hoàn toàn từ chối bình chọn câu trả lời của bạn khi không làm việc, cho đến khi tôi đọc nó gần hơn rất nhiều. Thật khéo léo. Đẹp nhất! – Benjohn

+0

Chỉ cần thêm rằng điều này sẽ không hoạt động trên trình mô phỏng. – GuybrushThreepwood

4

Swift (3.x) phiên bản của hai giải pháp phổ biến nhất trong hình thức cấp ngày:

extension Date { 

    static var is24HoursFormat_1 : Bool { 
     let dateString = Date.localFormatter.string(from: Date()) 

     if dateString.contains(Date.localFormatter.amSymbol) || dateString.contains(Date.localFormatter.pmSymbol) { 
      return false 
     } 

     return true 
    } 

    static var is24HoursFormat_2 : Bool { 
     let format = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.autoupdatingCurrent) 
     return !format!.contains("a") 
    } 

    private static let localFormatter : DateFormatter = { 
     let formatter = DateFormatter() 

     formatter.locale = Locale.autoupdatingCurrent 
     formatter.timeStyle = .short 
     formatter.dateStyle = .none 

     return formatter 
    }() 
} 

Cách sử dụng:

Date.is24HoursFormat_1 
Date.is24HoursFormat_2 

Swift (2.0) phiên bản của hai giải pháp phổ biến nhất dưới hình thức mở rộng NSDate:

extension NSDate { 

    class var is24HoursFormat_1 : Bool { 
     let dateString = NSDate.localFormatter.stringFromDate(NSDate()) 

     if dateString.containsString(NSDate.localFormatter.AMSymbol) || dateString.containsString(NSDate.localFormatter.PMSymbol) { 
      return false 
     } 

     return true 
    } 

    class var is24HoursFormat_2 : Bool { 
     let format = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.autoupdatingCurrentLocale()) 
     return !format!.containsString("a") 
    } 

    private static let localFormatter : NSDateFormatter = { 
     let formatter = NSDateFormatter() 

     formatter.locale = NSLocale.autoupdatingCurrentLocale() 
     formatter.timeStyle = .ShortStyle 
     formatter.dateStyle = .NoStyle 

     return formatter 
    }() 
} 

Xin lưu ý rằng Apple nói sau trên NSDateFormatter (Date Formatters):

Tạo một định dạng ngày không phải là một hoạt động rẻ. Nếu bạn có khả năng là để sử dụng trình định dạng thường xuyên, thường là hiệu quả hơn để lưu vào bộ nhớ cache một cá thể đơn lẻ hơn là tạo và xử lý nhiều phiên bản. Một cách tiếp cận là sử dụng biến tĩnh.

Thats lý do tĩnh để

Thứ hai bạn nên sử dụng NSLocale.autoupdatingCurrentLocale() (đối với is24HoursFormat_1), như vậy bạn sẽ luôn luôn nhận được tình trạng hiện tại thực tế.

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