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
risposta
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.
Grazie per la risposta. Mi aiuta molto. – Gypsa
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
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)
}
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
Ahh, certo, grazie :) L'ho modificato ora .. – Wiingaard
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)
}
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
}
La risposta più corretta credo –
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
già risposto [qui] (http://stackoverflow.com/q/1929958/154803) – progrmr
@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
@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