獲取時間週期型別(12 小時或 24 小時)

檢查當前日期是否包含 AM 或 PM 的符號

Objective-C

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);

NSDateFormatter 請求時間週期型別

Objective-C

NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL is24h = containsA.location == NSNotFound;

這使用了一個名為 j 的特殊日期模板字串,根據 ICU Spec

[…]請求區域設定(h,H,K 或 k)的首選小時格式,由補充資料中小時元素的首選屬性確定。 […]請注意,在傳遞給 API 的骨架中使用’j’是讓骨架請求區域設定的首選時間週期型別(12 小時或 24 小時)的唯一方法。

最後一句很重要。它是骨架請求區域設定首選時間週期型別的唯一方法。由於 NSDateFormatterNSCalendar 是建立在 ICU 庫上的,所以這裡也是如此。

參考

第二個選項來自這個答案