Определить, если формат времени в 12-часовом или 24-часовом формате
Есть ли способ определить, использует ли текущее устройство приложения 12h в нашем 24-часовом формате, чтобы я мог использовать один NSDateFormatter в течение 12 часов и один в течение 24 часов в зависимости от настроек языка / языка пользователя? Так же, как UIDatePicker обнаруживает и показывает AM/PM, если это 12-часовой формат.
5 ответов
Я понял это довольно легко. Я только что добавил этот код в 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"));
И это прекрасно возвращает YES
или же NO
в зависимости от локали.
И вот обновленная версия 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)
}
Это быстрое решение, которое сработало для меня, те два выше не сработали.
let dateString: String = DateFormatter.dateFormat (fromTemplate: "j", параметры: 0, языковой стандарт: Locale.current)! if(dateString.contains("a")){
// 12 h format
return true
}else{
// 24 h format
return false
}
Для 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. Обратите внимание, что использование "j" в скелете, передаваемом в API, - единственный способ заставить скелет запрашивать предпочтительный тип временного цикла языкового стандарта (12-часовой или 24-часовой).
Последнее предложение очень важно. Это "единственный способ заставить скелет запросить предпочтительный тип временного цикла локали". Поскольку NSDateFormatter и NSCalendar построены на библиотеке ICU, здесь то же самое.
Вот версия 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)
}
Цель 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