ios - ios中区域为 "United Kingdom"时如何获取系统时间格式?

标签 ios objective-c iphone nsdateformatter date-formatting

我正在使用以下代码在 ios 中获取系统时间格式。当我当前的区域设置为“美国”时,它工作正常,但当我将区域从“美国”更改为“英国”时,它总是提供 12 小时的合成时间。

#pragma mark
#pragma mark - get system time
-(BOOL)getSystemTimeFormat
{
    NSString *strDateFormate = @"hh a";
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:strDateFormate options:0 locale:[NSLocale currentLocale]];
    if ([dateFormat rangeOfString:@"h"].location != NSNotFound)
    {
        [kNSUserDefaults setBool:YES forKey:@"TimeFormat"];
        [kNSUserDefaults synchronize];
        return YES;
    }
    else
    {
        [kNSUserDefaults setBool:NO forKey:@"TimeFormat"];
        [kNSUserDefaults synchronize];
        return NO;
    }

}

“美国”地区的日志::

2015-01-27 11:32:16.090 [350:60b] 12 Formate :: 0
2015-01-27 11:32:16.585 [350:60b] Connect
2015-01-27 11:32:16.591 [350:60b] Loction update...
2015-01-27 11:32:16.604 [350:60b] Loction update...
2015-01-27 11:32:16.622 [350:60b] Loction update...

“英国”地区的日志::

2015-01-27 11:33:35.785 [364:60b] 12 Formate :: 1
2015-01-27 11:33:36.777 [364:60b] Connect
2015-01-27 11:33:36.780 [364:60b] Loction update...
2015-01-27 11:33:36.806 [364:60b] Loction update...
2015-01-27 11:33:36.832 [364:60b] Loction update...

最佳答案

经过对这个主题的大量研发,我终于找到了这个问题的解决方案。

这使用了一个名为“j”的特殊日期模板字符串。根据ICU Spec , "j"...

Requests the preferred hour format for the locale (h, H, K, or k), as determined by whether h, H, K, or k is used in the standard short time format for the locale. In the implementation of such an API, 'j' must be replaced by h, H, K, or k before beginning a match against availableFormats data. Note that use of 'j' in a skeleton passed to an API is the only way to have a skeleton request a locale's preferred time cycle type (12-hour or 24-hour). That last sentence is important. It "is the only way to have a skeleton request a locale's preferred time cycle type". Since NSDateFormatter and NSCalendar are built on the ICU library, the same holds true here.

所以我更改了代码中的模板值

#pragma mark
#pragma mark - get system time
-(BOOL)getSystemTimeFormat
{
    NSString *strDateFormate = @"j";
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:strDateFormate options:0 locale:[NSLocale currentLocale]];
    if ([dateFormat rangeOfString:@"a"].location != NSNotFound)
    {
        [kNSUserDefaults setBool:YES forKey:@"TimeFormat"];
        [kNSUserDefaults synchronize];
        return YES;
    }
    else
    {
        [kNSUserDefaults setBool:NO forKey:@"TimeFormat"];
        [kNSUserDefaults synchronize];
        return NO;
    }

}

我从以下链接找到了这个解决方案 How can I determine if iPhone is set for 12 hour or 24 hour time display? .

关于ios - ios中区域为 "United Kingdom"时如何获取系统时间格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28175368/

相关文章:

iOS - 删除 UITabBarViewController 阴影

objective-c - 调用 [NSScreen mainScreen] 时的额外线程

iphone - 使用大量 CALayer 对象时优化性能的技巧?

iPhone应用程序在后台运行,无需后台程序(Cydia)

iphone - 如何为 UIButton 的文本添加换行符?

ios - 如何在 Today 扩展中发送和接收数据

ios - 如何在实例方法中访问类方法变量或对两者使用公共(public)变量?

objective-c - 尽管文件夹中包含文件,NSString 路径始终返回 nil

ios - -(IBAction)oneButton1:(id)发送者

ios - 无法调用 :drawAtPoint for a UIImage* returned from a method