2011-09-16 22 views
34

C'è un modo per rilevare se il dispositivo corrente dell'app utilizza 12 ore il nostro formato 24 ore, in modo da poter utilizzare un NSDateFormatter per 12 ore e uno per 24 ore a seconda della lingua degli utenti/impostazione loaction? Proprio come UIDatePicker rileva e mostra il selettore AM/PM se è in formato 12h.Rileva se il formato dell'ora è nel formato 12 ore o 24 ore

+5

già risposto [qui] (http://stackoverflow.com/q/1929958/154803) – progrmr

+0

@progrmr che è sicuramente una buona soluzione per determinare se il clock a 24 ore è impostato o meno, ma dipende dal comportamento dei formattatori di data. L'OP voleva che queste informazioni formassero una stringa usando il formattatore della data in modo tale che la soluzione implicasse l'aggiunta di una categoria, la creazione di un formattatore di date, la conversione di una data in una stringa, la ricerca della stringa due volte per i simboli AM/PM, quindi la ramificazione del codice in formattare utilizzando il formato 12 ore o 24 ore quando lo fa già per te. – Joe

+1

@Joe Lo so, ma a volte devi sapere per altri motivi, come mettere l'AM in un UILabel separato con un font diverso, l'OP non era chiaro esattamente perché volesse sapere. – progrmr

risposta

78

L'ho capito, è piuttosto facile. Ho appena aggiunto questo codice di 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")); 

e restituisce perfettamente YES o NO a seconda del locale.

+0

Grazie per la risposta. Mi aiuta molto. – Gypsa

+0

Funziona solo se il calendario locale utilizza lo stesso formato del telefono, ma su iOS è possibile impostare in modo specifico il formato dell'ora che potrebbe renderlo diverso da quello utilizzato nel calendario locale. – yoeriboven

1

Ecco la versione 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

Si sta utilizzando l'operatore ternario come NOT, che rende solo più difficile la lettura. La riga di restituzione dovrebbe essere questo 'return! (PmRange == nil && amRange == nil)' – EmilioPelaez

+0

Ahh, certo, grazie :) L'ho modificato ora .. – Wiingaard

10

Ed ecco uno Swift 3.0 versione aggiornata

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

questo è rapida soluzione che ha funzionato per me, quei due di cui sopra non ha fatto.

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

La risposta più corretta credo –

0

Obiettivo categoria 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 
Problemi correlati