1

我正在尝试检测时间格式是 12 小时/24 小时格式。基于此,我在日历中设置时间。
我使用以下代码在 viewDidLoad 方法中检测设备上的 24 小时格式。

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]];
is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);

之后我检查如下

if (is24h == TRUE) {
} else {
}

但我总是得到 is24h 值是假的。如果设备设置为 12 小时格式,我可以在日历中设置时间。但如果是 24 小时格式,我无法设置时间。

你能告诉我我需要改变的地方吗?

4

3 回答 3

9

使用此方法确定时间格式

- (BOOL)timeIs12HourFormat {
    NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
    NSRange containsA = [formatStringForHours rangeOfString:@"a"];
    BOOL hasAMPM = containsA.location != NSNotFound;
    return hasAMPM;
}

根据unicode 日期格式指南 j意味着

这是一个特殊用途的符号。它不得出现在模式或骨架数据中。相反,它保留用于传递给执行灵活日期模式生成的 API 的骨架中。在这种情况下,它会请求区域设置的首选小时格式(h、H、K 或 k),这取决于是否在区域设置的标准短时间格式中使用了 h、H、K 或 k。在此类 API 的实现中,在开始与 availableFormats 数据进行匹配之前,必须将“j”替换为 h、H、K 或 k。请注意,在传递给 API 的框架中使用“j”是让框架请求区域设置的首选时间周期类型(12 小时或 24 小时)的唯一方法。

编辑

这将首先从设备的 currentLocale 获取 formatString,然后检查“a”是否存在,则为 12 小时格式,如果不存在,则为 24 小时格式。

于 2013-03-19T06:14:31.077 回答
1

嗨,现在我的代码工作正常。我写的代码如下。

-(BOOL)timeIs24HourFormat{

    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]];
    is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);

    return is24h;
}
于 2013-03-19T06:50:52.373 回答
-2

如果你想要一个 12 小时时钟,那么设置 currentDate 如下:

[currentDate setDateFormat:@"yyyy-MM-dd h:mm:ss a"];

如果您想要 24 小时制时钟,请按如下方式设置 currentDate:

[currentDate setDateFormat:@"yyyy-MM-dd HH:mm"];
于 2013-03-19T06:15:06.673 回答