根据应用设置而不是设备设置,在UIDatepicker中以12小时和24小时格式显示时间。

31

我的问题是我的应用程序中有一个开关,可以切换12小时和24小时的时间格式。我按照此设置显示标签时间,但UIDatePicker的时间没有更改。它的时间取决于设备时间设置格式。是否可能根据我的应用程序设置在UIDatePicker中显示时间,而不是根据设备时间设置呢?

我在某个地方读到过UIDatePicker只尊重设备设置,但我仍然想问一下,是否有可能根据我的应用程序设置在UIDatePicker中以12或24小时格式显示时间。

请帮帮我。 任何建议都将不胜感激!


我已经发布了一个解决方法的答案,而不是通过区域设置进行更改。在用户选择后转换该值。 - Muhammad Asyraf
12个回答

37
尝试使用以下代码在 DatePicker 中显示24小时格式:
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"NL"];
[self.datePicker setLocale:locale];

Locale NL 是荷兰,而在荷兰时间总是以24小时制表示。操作系统会识别这一点并提供适当的选择器。个人不建议更改日期选择器的格式,因为它应该按照用户的要求进行操作。 - Ash
3
错误的解决方案。这可能会导致DateTime picker出现时间错误,因为选择器是配置在荷兰语环境中! - Martin
也许在英语中可以工作,但设置固定的区域设置是一个不好的主意。 - Honghao Z
@RaduSimionescu 的解决方案是错误的,因为唯一可接受的解决方案是被认可的那个:时间格式仅取决于语言环境,可以在用户设置中进行配置。因此,在代码中编写 @"NL" 强制使用24小时格式只会引起不必要的麻烦 :) - Martin
哈哈 @RaduSimionescu,我只是不喜欢在我的代码中使用魔法数字 (或者魔法字符串) :) - Martin
显示剩余3条评论

32

在 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

这在iOS 16.5中不再起作用。 - Sivakrishna Perla

22

对于UIDatePicker,您无法将时间格式更改为24小时或12小时制,这取决于用户在设置中的本地设置。


1
@AlmasAdilbek,你能提一下我们怎么做吗?这已经在UIDatePicker - 国际化中提到了,改变本地设置会限制格式。 - Ahmad F
@AhmadF 从 '16 年回来了。实际上,看下面的答案 ↓,用标识符初始化 NSLocale,比如说 kk_Cyrl_KZ 将返回 24 小时格式。 - Almas Adilbek
@AlmasAdilbek 这意味着格式将基于指定的本地设置。请检查这个答案 - Ahmad F
@AlmasAdilbek 实际上,这个问题有一个解决方法。但是,它只能在选择后转换值,而不能在选择时转换。由于用户设备在选择时间时为12小时制,因此最好使用12小时制,因为用户已经熟悉该格式。但是可以通过使用日期格式化程序在之后转换值。 - Muhammad Asyraf

14

ak2g的回答的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")

13

不需要任何一行代码。我们也可以通过Storyboard设置区域设置,我已经附上了截图。

enter image description here

如果要以编程方式执行此操作,我们还可以编写以下代码。

dateTimePicker.locale = Locale(identifier: "en_GB")

在iOS16.5中,这个已经不再起作用了。 - Sivakrishna Perla

5

仅需使用以下内容, 对于24小时格式:

picker.locale = Locale.init(identifier: "en_gb")

12小时格式:

picker.locale = Locale.init(identifier: "en_us")

为什么这样做可以生效呢?因为en_gb代表的是英式英语,其更倾向于24小时制。而你猜对了,en_us代表的是美式英语,其更倾向于12小时制。


4

轻松格式化结果

由于设备本地时间不是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

3

我找到了一个更简单的方法,在storyboard上点击UIDatePicker属性检查器,将语言环境设置为“英语(欧洲)”。这样可以去掉AM/PM切换按钮,并且将时间设置为24小时格式。


我希望这个答案能够提供更多细节。 - Travis Griggs

2
将您的UIDatepicker设置为具有区域属性,以便它不会默认使用用户的区域设置。
这里是进行此操作的文档,请确保设置国家而不是语言
编辑:实际上,看起来在iOS 5.0中已经弃用了locale。我想苹果认为人们不应该覆盖它。

吴先生,您能否提供一些代码?因为我已经尝试过了,但它不起作用。 - Gypsa
我不确定了,因为在最新的操作系统中,似乎locale属性已经被弃用了,但是可以参考这些类似的问题: http://stackoverflow.com/questions/6197641/24hr-uidatepicker https://dev59.com/rU3Sa4cB1Zd3GeqPtTUQ - Lawrence Wu
抱歉链接没有用。您能否提供其他建议? - Gypsa

1

编辑:虽然这似乎是使用此 API 的正确方法,但 UIDatePicker 不尊重 hourCycle 属性(还没有?)并且只会根据 Locale 的地区进行操作。
甚至 DateFormatter 也不尊重它,这真是令人困惑。

有一种新的正确方法可以使用 iOS 16 的新 Locale.ComponentshourCycle 属性:

var components = Locale.Components(locale: .current)
components.hourCycle = use24h ? .zeroToTwentyThree : .oneToTwelve
let locale = Locale(components: components)
datePicker.locale = locale

这不会覆盖用户的其他区域设置,如语言等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接