pro*_*rmr 41 iphone datetime localization
我以为我最近在SO上看到了回答这个问题,但现在我找不到了.这是我现在使用的代码,用于确定设置是否为24小时时间显示.它适用于我在美国,但我不知道它是否适用于所有语言环境.这是否足够或是否有更好的方法来找出当前的设置?
+(BOOL) use24HourClock
{
BOOL using24HourClock = NO;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale: [NSLocale currentLocale]];
[dateFormatter setDateStyle:kCFDateFormatterNoStyle];
[dateFormatter setTimeStyle:kCFDateFormatterShortStyle];
// get date/time (1Jan2001 0000UTC)
NSDate* midnight = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:0];
NSString* dateString = [dateFormatter stringFromDate: midnight];
// dateString will either be "15:00" or "16:00" (depending on DST) or
// it will be "4:00 PM" or "3:00 PM" (depending on DST)
using24HourClock = ([dateString length] == 5);
[midnight release];
[dateFormatter release];
return using24HourClock;
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*ong 84
这是最好的方法:
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL hasAMPM = containsA.location != NSNotFound;
Run Code Online (Sandbox Code Playgroud)
在斯威夫特:
let formatString: NSString = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.currentLocale())!
let hasAMPM = formatString.containsString("a")
Run Code Online (Sandbox Code Playgroud)
斯威夫特4:
let formatString = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
let hasAMPM = formatString.contains("a")
Run Code Online (Sandbox Code Playgroud)
这使用名为"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库上,这同样适用.
Mic*_*all 22
我刚刚在这里问了一个类似的问题,我已经设法找到了一个很好的方法来确定这一点,我已经添加了一个类别的函数NSLocale.它看起来非常准确,并且在测试多个地区时没有发现任何问题.
@implementation NSLocale (Misc)
- (BOOL)timeIs24HourFormat {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:self];
[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 is24Hour = (amRange.location == NSNotFound && pmRange.location == NSNotFound);
[formatter release];
return is24Hour;
}
@end
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
我给了戴夫的答案,但是当用德语语言环境测试时 - 一个使用24小时时间周期的区域 - 我意识到在格式字符串而不是a中检查H或k会更好,并且引用的子字符串应该是忽略.
对于德语语言环境,我在iOS模拟器中请求模板"j"的日期格式时返回"HH a",并在设备上请求"HH'Uhr'".(不明白为什么会有所不同.)
这是NSLocale我用来检查24小时时间周期的类别:
@interface NSLocale (TwentyFourHourTimeCycleCheck)
- (BOOL)uses24HourTimeCycle;
@end
@implementation NSLocale (TwentyFourHourTimeCycleCheck)
- (BOOL)uses24HourTimeCycle
{
BOOL uses24HourTimeCycle = NO;
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:self];
NSScanner *symbolScanner = [NSScanner scannerWithString:formatStringForHours];
NSString *singleQuoteCharacterString = @"'";
// look for single quote characters, ignore those and the enclosed strings
while ( ![symbolScanner isAtEnd] ) {
NSString *scannedString = @"";
[symbolScanner scanUpToString:singleQuoteCharacterString intoString:&scannedString];
// if 'H' or 'k' is found the locale uses 24 hour time cycle, and we can stop scanning
if ( [scannedString rangeOfString:@"H"].location != NSNotFound ||
[scannedString rangeOfString:@"k"].location != NSNotFound ) {
uses24HourTimeCycle = YES;
break;
}
// skip the single quote
[symbolScanner scanString:singleQuoteCharacterString intoString:NULL];
// skip everything up to and including the next single quote
[symbolScanner scanUpToString:singleQuoteCharacterString intoString:NULL];
[symbolScanner scanString:singleQuoteCharacterString intoString:NULL];
}
return uses24HourTimeCycle;
}
@end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10153 次 |
| 最近记录: |