检测时间格式是否为12小时或24小时格式

时间:2011-09-16 17:31:49

标签: objective-c ios cocoa-touch nstimezone

有没有办法检测应用程序的当前设备是否使用12h我们的24h格式,这样我可以使用一个NSDateFormatter 12h和一个24h,具体取决于用户语言/ loaction设置?就像UIDatePicker检测并显示AM / PM选择器(如果它是12h格式)。

6 个答案:

答案 0 :(得分:80)

我想通了,很简单。我刚刚将此代码添加到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,具体取决于区域设置。

答案 1 :(得分:11)

这是一个Swift 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)
}

答案 2 :(得分: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 }

答案 3 :(得分:2)

这是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)
}

答案 4 :(得分:1)

目标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

答案 5 :(得分:1)

对于Swift 5.3。 在Xcode 12上进行了测试。

func is12hClockFormat() -> Bool {
    let formatString = DateFormatter.dateFormat(
        fromTemplate: "j",
        options: 0,
        locale: Locale.current
    )!
    return formatString.contains("a")
}

这使用特殊的日期模板字符串“ j”。根据ICU规范,“ j” ...

请求语言环境(h,H,K或k)的首选小时格式,这取决于在语言环境的标准短时间格式中是否使用h,H,K或k。在此类API的实现中,在开始与availableFormats数据进行匹配之前,必须用h,H,K或k替换'j'。请注意,在传递给API的框架中使用'j'是使框架请求语言环境的首选时间周期类型(12小时或24小时)的唯一方法。

最后一句话很重要。它“是让骨架请求语言环境的首选时间周期类型的唯一方法”。由于NSDateFormatter和NSCalendar是在ICU库上构建的,因此在这里同样适用。

https://stackoverflow.com/a/11660380/3428146

收集