我的问题是我的应用程序中有一个开关,可以切换12小时和24小时的时间格式。我按照此设置显示标签时间,但UIDatePicker
的时间没有更改。它的时间取决于设备时间设置格式。是否可能根据我的应用程序设置在UIDatePicker
中显示时间,而不是根据设备时间设置呢?
我在某个地方读到过UIDatePicker只尊重设备设置,但我仍然想问一下,是否有可能根据我的应用程序设置在UIDatePicker
中以12或24小时格式显示时间。
请帮帮我。 任何建议都将不胜感激!
我的问题是我的应用程序中有一个开关,可以切换12小时和24小时的时间格式。我按照此设置显示标签时间,但UIDatePicker
的时间没有更改。它的时间取决于设备时间设置格式。是否可能根据我的应用程序设置在UIDatePicker
中显示时间,而不是根据设备时间设置呢?
我在某个地方读到过UIDatePicker只尊重设备设置,但我仍然想问一下,是否有可能根据我的应用程序设置在UIDatePicker
中以12或24小时格式显示时间。
请帮帮我。 任何建议都将不胜感激!
DatePicker
中显示24小时格式:NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"NL"];
[self.datePicker setLocale:locale];
@"NL"
强制使用24小时格式只会引起不必要的麻烦 :) - Martin在 Swift 中
// myDatePicker is yourUIDatePicker Outlet
@IBOutlet weak var myDatePicker: UIDatePicker!
// For 24 Hrs
myDatePicker.locale = NSLocale(localeIdentifier: "en_GB") as Locale
//For 12 Hrs
timePickerView.locale = NSLocale(localeIdentifier: "en_US") as Locale
对于UIDatePicker
,您无法将时间格式更改为24小时或12小时制,这取决于用户在设置中的本地设置。
NSLocale
,比如说 kk_Cyrl_KZ
将返回 24 小时格式。 - Almas Adilbekak2g的回答的Swift 4版本:
// myDatePicker is yourUIDatePicker Outlet
@IBOutlet weak var myDatePicker: UIDatePicker!
// For 24 Hrs
myDatePicker.locale = Locale(identifier: "en_GB")
//For 12 Hrs
myDatePicker.locale = Locale(identifier: "en_US")
仅需使用以下内容, 对于24小时格式:
picker.locale = Locale.init(identifier: "en_gb")
12小时格式:
picker.locale = Locale.init(identifier: "en_us")
为什么这样做可以生效呢?因为en_gb代表的是英式英语,其更倾向于24小时制。而你猜对了,en_us代表的是美式英语,其更倾向于12小时制。
轻松格式化结果
由于设备本地时间不是24小时制,选择12小时制的时间格式没有问题。主要问题在于当您试图向服务器提交时间并且服务器要求使用24小时格式时,这个问题就会出现。
然而,对于用户来说,使用12小时格式比24小时格式更容易。但是服务器通常需要时间以24小时格式呈现。
既然您提到:
不在设备设置中
我只能假定您正在尝试在不干扰手机上的用户默认设置的情况下实现此操作。但如果您的问题与视图有关,则
myDatePicker.locale = NSLocale(localeIdentifier: "en_GB")
这是唯一的方法。
我的做法不是以24小时制显示,而是将结果转换为24小时制。
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
print("\(pickerView.date)") // 10:30 PM
let dateSelect = dateFormatter.string(from: pickerView.date)//pickerView = to your UIDatePicker()
self.tfclosing.text = dateSelect // 22:30
我找到了一个更简单的方法,在storyboard上点击UIDatePicker属性检查器,将语言环境设置为“英语(欧洲)”。这样可以去掉AM/PM切换按钮,并且将时间设置为24小时格式。
编辑:虽然这似乎是使用此 API 的正确方法,但 UIDatePicker
不尊重 hourCycle
属性(还没有?)并且只会根据 Locale
的地区进行操作。
甚至 DateFormatter
也不尊重它,这真是令人困惑。
有一种新的正确方法可以使用 iOS 16 的新 Locale.Components
和 hourCycle
属性:
var components = Locale.Components(locale: .current)
components.hourCycle = use24h ? .zeroToTwentyThree : .oneToTwelve
let locale = Locale(components: components)
datePicker.locale = locale
这不会覆盖用户的其他区域设置,如语言等。