2011-09-16 53 views
34

Có cách nào để phát hiện xem thiết bị hiện tại của ứng dụng có sử dụng định dạng 24h của chúng tôi hay không, để tôi có thể sử dụng một NSDateFormatter trong 12 giờ và một cho 24h tùy thuộc vào ngôn ngữ người dùng/Loaction thiết lập? Cũng giống như UIDatePicker phát hiện và hiển thị bộ chọn AM/PM nếu nó là định dạng 12h.Phát hiện xem định dạng thời gian có ở định dạng 12 giờ hoặc 24 giờ

+5

Đã trả lời [ở đây] (http://stackoverflow.com/q/1929958/154803) – progrmr

+0

@progrmr rằng chắc chắn một là giải pháp tốt để xác định nếu đồng hồ 24 giờ được đặt hay không nhưng nó phụ thuộc vào hành vi của Trình định dạng ngày tháng. OP muốn thông tin này định dạng một chuỗi bằng cách sử dụng định dạng ngày để giải pháp bao gồm thêm danh mục lớp, tạo định dạng ngày, chuyển đổi ngày thành chuỗi, tìm kiếm chuỗi hai lần cho các ký hiệu AM/PM, sau đó phân nhánh mã của bạn thành định dạng bằng cách sử dụng định dạng 12 giờ hoặc 24 giờ khi nó đã làm điều đó cho bạn. – Joe

+1

@ Joe tôi biết điều đó, nhưng đôi khi bạn cần phải biết vì những lý do khác, như để đặt "AM" trong một UILabel riêng biệt với một phông chữ khác nhau, OP không rõ ràng chính xác lý do tại sao anh muốn biết. – progrmr

Trả lời

78

Tôi đã tìm ra, nó khá dễ dàng. Tôi chỉ cần thêm đoạn mã này để viewDidLoad:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setLocale:[NSLocale currentLocale]]; 
[formatter setDateStyle:NSDateFormatterNoStyle]; 
[formatter setTimeStyle:NSDateFormatterShortStyle]; 
NSString *dateString = [formatter stringFromDate:[NSDate date]]; 
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]]; 
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]]; 
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound); 
[formatter release]; 
NSLog(@"%@\n",(is24h ? @"YES" : @"NO")); 

Và nó hoàn trả YES hoặc NO tùy thuộc vào địa điểm.

+0

Cảm ơn câu trả lời của bạn. Nó giúp tôi rất nhiều. – Gypsa

+0

Điều này chỉ hoạt động nếu lịch địa phương sử dụng cùng định dạng như điện thoại nhưng trên iOS, bạn có thể đặt định dạng thời gian cụ thể có thể khác với những gì được sử dụng trong lịch địa phương. – yoeriboven

1

Dưới đây là phiên bản Swift:

func using12hClockFormat() -> Bool { 

    let formatter = NSDateFormatter() 
    formatter.locale = NSLocale.currentLocale() 
    formatter.dateStyle = NSDateFormatterStyle.NoStyle 
    formatter.timeStyle = NSDateFormatterStyle.ShortStyle 

    let dateString = formatter.stringFromDate(NSDate()) 
    let amRange = dateString.rangeOfString(formatter.AMSymbol) 
    let pmRange = dateString.rangeOfString(formatter.PMSymbol) 

    return !(pmRange == nil && amRange == nil) 
} 
+0

Bạn đang sử dụng toán tử bậc ba làm NOT, điều này chỉ khiến bạn khó đọc hơn. Dòng trả về phải là 'return! (PmRange == nil && amRange == nil)' – EmilioPelaez

+0

Ahh, chắc chắn, cảm ơn :) Tôi đã chỉnh sửa ngay bây giờ .. – Wiingaard

10

Và đây là một Swift 3.0 được cập nhật phiên bản

func using12hClockFormat() -> Bool { 

    let formatter = DateFormatter() 
    formatter.locale = Locale.current 
    formatter.dateStyle = .none 
    formatter.timeStyle = .short 

    let dateString = formatter.string(from: Date()) 
    let amRange = dateString.range(of: formatter.amSymbol) 
    let pmRange = dateString.range(of: formatter.pmSymbol) 

    return !(pmRange == nil && amRange == nil) 
} 
3

đây là giải pháp nhanh chóng mà làm việc cho tôi, hai ở trên thì không.

let dateString : String = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!

if(dateString.contains("a")){ // 12 h format return true }else{ // 24 h format return false }

+0

Câu trả lời đúng nhất tôi đoán –

0

Objective loại C NSDate+Extensions:

@import Foundation; 

@interface NSDate (Extensions) 

- (NSString *)getTimeString; 

@end 


#import "NSDate+Extensions.h" 

@implementation NSDate (Extensions) 

- (NSString *)getTimeString 
{ 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    if ([self isTwelveHourDateFormat]) { 
     [formatter setDateFormat:@"hh:mm\ndd MMM"]; 
    } 
    else { 
     [formatter setDateFormat:@"HH:mm\ndd MMM"]; 
    } 
    return [formatter stringFromDate:self]; 
} 

- (BOOL)isTwelveHourDateFormat 
{ 
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]]; 
    return [dateFormat containsString:@"a"]; 
} 

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