我在ios中使用以下代码获取系统时间格式。当我目前的地区设置为" United State"但当我改变地区的时候,#34; United State"到#34;英国"它总是给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]连接
2015-01-27 11:32:16.591 [350:60b]位置更新...
2015-01-27 11:32:16.604 [350:60b]位置更新...
2015-01-27 11:32:16.622 [350:60b]地点更新......
记录"英国"区域::
2015-01-27 11:33:35.785 [364:60b] 12 Formate :: 1
2015-01-27 11:33:36.777 [364:60b]连接
2015-01-27 11:33:36.780 [364:60b]位置更新...
2015-01-27 11:33:36.806 [364:60b]位置更新...
2015-01-27 11:33:36.832 [364:60b]地点更新......
答案 0 :(得分:8)
经过大量关于这个主题的研究,我终于找到了解决这个问题的方法。
这使用名为" j"的特殊日期模板字符串。根据{{3}}," j" ...
请求区域设置的首选小时格式(h,H,K或k),由h,H,K或k是否以区域设置的标准短时间格式使用来确定。在实施这样的API时,' j'在开始匹配availableFormats数据之前,必须用h,H,K或k替换。请注意使用' j'在传递给API的骨架中,唯一的方法是让骨架请求区域设置的首选时间周期类型(12小时或24小时)。 最后一句很重要。它是使骨架请求区域设置的首选时间周期类型的唯一方法"。由于NSDateFormatter和NSCalendar是在ICU库上构建的,因此在这里也是如此。
所以我更改了代码中的模板值
#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;
}
}
我从以下链接ICU Spec找到了此解决方案。