簡體   English   中英

檢測時間格式是 12 小時還是 24 小時格式

[英]Detect if time format is in 12hr or 24hr format

有什么方法可以檢測應用程序的當前設備是否使用 12 小時我們的 24 小時格式,以便我可以根據用戶的語言/位置設置使用一個 NSDateFormatter 12 小時和一個 24 小時? 就像 UIDatePicker 檢測並顯示 AM/PM 選擇器一樣,如果它是 12h 格式。

我想通了,這很容易。 我剛剛將此代碼添加到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

這是一個 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", options: 0,
    locale: Locale.current
)!
if(dateString.contains("a")){
// 12 h format
   return true
}else{
// 24 h format
   return false
}

這是 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)
}

Objective 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

對於 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM