2011-09-16 43 views
34

有沒有什麼方法可以檢測到應用的當前設備是否使用12小時我們的24h格式,這樣我可以使用一個NSDateFormatter 12小時和一個24小時,具體取決於用戶的語言/放置設置?就像UIDatePicker檢測並顯示AM/PM選取器是否爲12h格式一樣。檢測時間格式是否爲12小時或24小時格式

+5

已經回答[這裏](http://stackoverflow.com/q/1929958/154803) – progrmr

+0

@progrmr那絕對是一個確定是否設置24小時制的好方案,但取決於日期格式化程序的行爲。 OP希望這些信息使用日期格式化程序格式化字符串,以便解決方案包括添加類別類別,創建日期格式化程序,將日期轉換爲字符串,爲AM/PM符號搜索字符串兩次,然後將代碼分支到格式使用12小時或24小時格式,當它已經爲你做。 – Joe

+1

@Joe我知道,但有時你需要知道其他原因,比如把「AM」放在一個單獨的不同字體的UILabel中,OP不清楚他爲什麼想知道。 – progrmr

回答

78

我覺得它很容易。我只是說此代碼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")); 

而且它完美地返回YESNO取決於語言環境。

+0

謝謝你的回答。它幫助我很多。 – Gypsa

+0

這隻適用於本地日曆使用與手機相同的格式,但在iOS上,您可以專門設置時間格式,使其與本地日曆中使用的格式不同。 – yoeriboven

1

這裏是斯威夫特版本:

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

您正在使用三元運算符作爲NOT,這使得它更難以閱讀。返回的行應該是這個'return!(pmRange == nil && amRange == nil)' – EmilioPelaez

+0

啊,當然,謝謝:)我已經編輯了它.. – Wiingaard

10

這裏是一個雨燕3.0更新版本

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

這是爲我工作迅速解決,以上這兩個沒有。

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

最正確的答案我猜 –

0

目標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 
相關問題