web-dev-qa-db-fra.com

Détecter si le format de l'heure est au format 12 heures ou 24 heures

Existe-t-il un moyen de détecter si l'appareil actuel de l'application utilise 12h notre format 24h, de sorte que je puisse utiliser un NSDateFormatter pendant 12h et un pendant 24h selon le paramètre de langue/emplacement de l'utilisateur? Tout comme l'UIDatePicker détecte et affiche le sélecteur AM/PM s'il est au format 12h.

39
JonasG

Je l'ai compris, c'est assez facile. Je viens d'ajouter ce code à 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"));

Et il retourne parfaitement YES ou NO selon les paramètres régionaux.

81
JonasG

Et voici une Swift 3.0 version mise à jour

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)
}
11
Mostafa Berg

c'est Swift solution qui a fonctionné pour moi, les deux ci-dessus ne l'ont pas fait.

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
   }
6
beowulf

Voici la version 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)
}
2
Wiingaard

Catégorie objectif 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
0
Denis Kutlubaev