2011-09-16 23 views
34

アプリの現在のデバイスが12時間24時間フォーマットを使用しているかどうかを検出する方法はないので、ユーザーの言語に応じてNSDateFormatterを12時間、/loactionの設定? Just Like UIDatePickerは、AM/PMピッカーが12時間形式であればそれを検出して表示します。時間フォーマットが12時間または24時間のフォーマットであるかどうかを検出する

+5

はすでに[ここ](http://stackoverflow.com/q/1929958/154803)間違いなく – progrmr

+0

@progrmrに答え24時間制が設定されているかどうかを判断するには良い解決策ですが、Date Formattersの動作に依存します。 OPは、この情報が日付フォーマッタを使って文字列をフォーマットするようにしました。これは、クラス・カテゴリの追加、日付フォーマッタの作成、日付の文字列への変換、AM/PMシンボルの文字列の2回の検索、すでに12時間または24時間形式のいずれかを使用してフォーマットしてください。 – Joe

+1

@ジョー私はそれを知っていますが、別の理由で、 "AM"を別のフォントの別のUILabelに入れるのが好きであることが必要な場合があります。 – 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")); 

そして、それは完全ロケールに応じYESまたはNO返します。

ここ
+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

3進演算子を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

のObjective 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 
関連する問題