我使用的UIDatePicker选择时间。 我还定制选择器的背景下,但是我需要根据用户是否正在使用12小时模式(其显示AM / PM柱)或24小时模式2个不同的图像。 我怎样才能检测到用户设定的12/24小时制时间?
谢谢
我使用的UIDatePicker选择时间。 我还定制选择器的背景下,但是我需要根据用户是否正在使用12小时模式(其显示AM / PM柱)或24小时模式2个不同的图像。 我怎样才能检测到用户设定的12/24小时制时间?
谢谢
有可能是很多很多......
甚至比别人更短:
NSString *format = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
BOOL is24Hour = ([format rangeOfString:@"a"].location == NSNotFound);
字符串格式化字符来表示的AM / PM符号是“一”,作为中记录的Unicode语言环境标记语言-第4部分:日期 。
同样的文件也解释了特殊的模板符号“J”:
这是一个特殊用途的符号。 它不能在图案或骨架数据发生。 相反,它被保留用于传递的API做灵活的日期模式生成骨骼。 在这样的背景下,它请求优选小时格式为语言环境(H,H,K,或k),如通过是否H,H,K,或K是为该区域设置标准时间短格式中使用来确定。 在这样的API的实现,“J”必须用h取代,H,K,或开始针对availableFormats数据的匹配之前ķ。 注意在传递给API的骨架在使用“J”的是有一个骨架请求的语言环境的优选时间周期型(12小时或24小时)的唯一途径。
该NSString
方法dateFormatFromTemplate:options:locale:
苹果在描述NSDateFormatter
文档 :
返回表示适当地配置为指定的区域设置给定日期格式部件本地化日期格式字符串。
那么,什么方法做的就是打开@"j"
你传递作为模板,以适合的格式字符串NSDateFormatter
。 如果这个字符串包含AM / PM符号@"a"
在任何地方,那么你知道的语言环境(和其他用户的设置由操作系统为你询问)想要显示AM / PM。
在日期延长形式两种最流行的解决方案斯威夫特(3.X)版本:
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
}()
}
使用方法:
Date.is24HoursFormat_1
Date.is24HoursFormat_2
在延长的NSDate形式的两种最流行的解决方案斯威夫特(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
}()
}
请注意,苹果称继NSDateFormatter( 日期格式化程序 ):
创建的日期格式是不是一个便宜的操作。 如果你很可能会经常使用格式化,它通常是更有效的缓存单个实例,而不是创建多个实例的处理。 一种方法是使用一个静态变量。
那是静态让利的原因
其次,你应该使用NSLocale.autoupdatingCurrentLocale()(用于is24HoursFormat_1),这样,你总是会得到实际的当前状态。