Вот лучший способ сделать это:
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL hasAMPM = containsA.location != NSNotFound;
в Свифте:
let formatString: NSString = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.currentLocale())!
let hasAMPM = formatString.containsString("a")
Swift 4:
let formatString = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
let hasAMPM = formatString.contains("a")
При этом используется специальная строка шаблона даты, которая называется "j". Согласно спецификации ICU , "j" ...
запрашивает предпочтительный часовой формат для локали (h, H, K или k), что определяется тем, используется ли h, H, K или k в стандартном коротком временном формате для локали. В реализации такого API «j» должен быть заменен на h, H, K или k перед началом сопоставления с данными доступных форматов. Обратите внимание, что использование j в скелете, передаваемом в API, является единственным способом заставить скелет запросить предпочтительный тип временного цикла локали (12 или 24 часа).
Последнее предложение важно. Это «единственный способ заставить скелет запросить предпочтительный тип временного цикла локали». Поскольку NSDateFormatter
и NSCalendar
построены на библиотеке ICU, то же самое справедливо и здесь.