2011-09-16 133 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 
相关问题