40

有什么方法可以检测应用程序的当前设备是否使用 12h 我们的 24h 格式,以便我可以根据用户的语言/位置设置使用一个 NSDateFormatter 12h 和一个 24h?就像 UIDatePicker 检测并显示 AM/PM 选择器(如果它是 12h 格式)一样。

4

6 回答 6

83

我想通了,这很容易。我刚刚将此代码添加到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取决于语言环境。

于 2011-09-24T10:39:22.803 回答
13

这是一个 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)
}
于 2016-10-03T10:49:21.020 回答
8

这是对我有用的快速解决方案,以上两个没有。

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
}
于 2017-01-24T00:19:34.823 回答
3

对于 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 数据进行匹配之前,必须将“j”替换为 h、H、K 或 k。请注意,在传递给 API 的框架中使用“j”是让框架请求区域设置的首选时间周期类型(12 小时或 24 小时)的唯一方法。

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

收集自https://stackoverflow.com/a/11660380/3428146

于 2020-10-26T17:58:25.653 回答
2

这是斯威夫特版本:

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)
}
于 2016-09-27T14:41:30.043 回答
2

目标 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
于 2018-01-10T08:42:20.103 回答