Dar*_*ren 7 xcode cocoa-touch uidatepicker
我正在使用UIDatePicker来选择时间.我也在自定义选择器的背景,但是我需要2个不同的图像,具体取决于用户是使用12小时模式(显示AM/PM列)还是24小时模式.如何检测12/24小时的用户设置?
谢谢
Dav*_*ong 34
甚至比其他人短:
NSString *format = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
BOOL is24Hour = ([format rangeOfString:@"a"].location == NSNotFound);
Run Code Online (Sandbox Code Playgroud)
表示am/pm符号的字符串格式化字符是"a",如Unicode区域设置标记语言 - 第4部分:日期中所述.
同一文档还解释了特殊模板符号"j":
这是一个特殊用途的符号.它不得出现在模式或骨架数据中.相反,它保留用于传递给执行灵活日期模式生成的API的骨架.在这样的上下文中,它请求区域设置(h,H,K或k)的首选小时格式,这由h,H,K或k是否以区域设置的标准短时间格式使用来确定.在这种API的实现中,在开始与availableFormats数据匹配之前,'j'必须被h,H,K或k替换.请注意,在传递给API的框架中使用"j"是使框架请求区域设置的首选时间周期类型(12小时或24小时)的唯一方法.
该NSString方法dateFormatFromTemplate:options:locale:在Apple的NSDateFormatter文档中描述:
返回一个本地化的日期格式字符串,表示为指定的语言环境适当排列的给定日期格式组件.
那么,该方法将做的是将@"j"您作为模板传入适合的格式字符串NSDateFormatter.如果此字符串@"a"在任何地方包含am/pm符号,那么您知道语言环境(以及操作系统为您查询的其他用户设置)是否要显示am/pm.
Swift (3.x) 版本的两个最流行的 Date 扩展形式的解决方案:
extension Date {
static var is24HoursFormat_1 : Bool {
let dateString = Date.localFormatter.string(from: Date())
if dateString.contains(Date.localFormatter.amSymbol) || dateString.contains(Date.localFormatter.pmSymbol) {
return false
}
return true
}
static var is24HoursFormat_2 : Bool {
let format = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.autoupdatingCurrent)
return !format!.contains("a")
}
private static let localFormatter : DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale.autoupdatingCurrent
formatter.timeStyle = .short
formatter.dateStyle = .none
return formatter
}()
}
Run Code Online (Sandbox Code Playgroud)
用法 :
Date.is24HoursFormat_1
Date.is24HoursFormat_2
Run Code Online (Sandbox Code Playgroud)
NSDate 扩展形式的两个最流行的解决方案的 Swift (2.0) 版本:
extension NSDate {
class var is24HoursFormat_1 : Bool {
let dateString = NSDate.localFormatter.stringFromDate(NSDate())
if dateString.containsString(NSDate.localFormatter.AMSymbol) || dateString.containsString(NSDate.localFormatter.PMSymbol) {
return false
}
return true
}
class var is24HoursFormat_2 : Bool {
let format = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.autoupdatingCurrentLocale())
return !format!.containsString("a")
}
private static let localFormatter : NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.locale = NSLocale.autoupdatingCurrentLocale()
formatter.timeStyle = .ShortStyle
formatter.dateStyle = .NoStyle
return formatter
}()
}
Run Code Online (Sandbox Code Playgroud)
请注意,Apple 在 NSDateFormatter ( Date Formatters )上说如下:
创建日期格式化程序并不是一项廉价的操作。如果您可能经常使用格式化程序,那么缓存单个实例通常比创建和处理多个实例更有效。一种方法是使用静态变量。
这就是静态 let 的原因
其次,您应该使用 NSLocale.autoupdatingCurrentLocale() (对于 is24HoursFormat_1 ),这样您将始终获得实际的当前状态。
| 归档时间: |
|
| 查看次数: |
7362 次 |
| 最近记录: |