【问题标题】:Show Time in 12 and 24 hour format in UIDatepicker on the basis of app settings not on device Settings根据应用程序设置而不是设备设置在 UIDatepicker 中以 12 和 24 小时格式显示时间
【发布时间】:2025-11-26 02:30:01
【问题描述】:

我的问题是我的应用程序中有一个切换 12 小时和 24 小时时间格式的开关。我正在根据它显示我的标签时间,但 UIDatePicker 时间没有改变。时间取决于设备时间设置格式。是否可以根据我的应用设置在UIDatePicker 中显示时间,这可能与设备时间设置不同。 我在某处读到 UIDatePicker 仅尊重设备设置,但我仍然想问是否可以根据我的应用设置以 UIDatePicker 的 12 小时和 24 小时格式显示时间。

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

【问题讨论】:

  • 我已经发布了解决方法的答案。而不是通过语言环境更改它。用户选择后转换值。

标签: iphone objective-c ios uidatepicker time-format


【解决方案1】:

尝试此代码以在DatePicker 中显示 24 小时格式:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"NL"];
[self.datePicker setLocale:locale];

【讨论】:

  • Locale NL 是荷兰,在荷兰,时间总是以 24 小时格式表示。操作系统会识别这一点并提供合适的选择器。我个人不建议更改日期选择器的格式,因为它应该按照用户的要求运行。
  • 错误的解决方案。由于选择器是在荷兰语言环境中配置的,因此可能会导致 DateTime 选择器出现时间错误!
  • 也许它适用于英语,但设置固定的语言环境是个坏主意
  • @Martin 怎么会这样?你能举个例子吗?是否可以以某种方式防止错误?
  • @RaduSimionescu 错误的解决方案,因为唯一可接受的解决方案是接受的解决方案:小时格式仅取决于区域设置,可以在用户设置中配置。因此,写@"NL" 来强制 24Hrs 格式只不过是代码味道:)
【解决方案2】:

在 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

【讨论】:

    【解决方案3】:

    UIDatePicker 不能将时间格式改为 24 或 12,这取决于 setting.app 中的用户本地设置

    【讨论】:

    • @AlmasAdilbek 你能提到我们怎么做吗?!这在UIDatePicker 中已经提到 - 更改本地将限制格式的国际化。
    • @AhmadF Commin 从 16 年回来。其实看看下面的答案↓,用标识符初始化NSLocale,假设kk_Cyrl_KZ会返回24小时制。
    • @AlmasAdilbek 这意味着格式将基于分配的本地。检查this answer
    • @AlmasAdilbek 实际上有一个解决方法。但是,它只在选择后转换值。不被选中。由于用户设备在选择时间时处于 12 小时制,因此最好使用 12 小时制,因为用户已经熟悉该格式。但之后可以使用 dateformatter 转换值。
    【解决方案4】:

    Swift 4 版本的 ak2g 的回答:

    // 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")
    

    【讨论】:

      【解决方案5】:

      不需要任何一行代码。我们也可以从 Story Board 中设置语言环境,我已附上屏幕截图。

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

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

      【讨论】:

        【解决方案6】:

        只需使用, 对于 24 小时格式:

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

        12 小时制:

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

        为什么会这样?因为 en_gb 是英式英语,它更喜欢 24 小时格式。你猜对了,en_us 是美式英语,它更喜欢 12 小时格式。

        【讨论】:

          【解决方案7】:

          改为轻松格式化结果

          由于本地设备不在 24 小时内。选择12h格式的时间没有问题。主要是当您尝试向服务器提交时间时会出现此问题。以及以 24 小时格式请求它的服务器。

          但是,对于用户来说,使用 12h 格式而不是 24h 格式更容易。 但服务器通常需要时间为 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
          

          【讨论】:

            【解决方案8】:

            我找到了一种更简单的方法,单击情节提要上的 UIDatePicker 属性检查器,并将语言环境设置为“英语(欧洲)”。这将取消 AM/PM 切换并将时间设置为 24 小时格式。

            【讨论】:

            • 我希望这个答案有更多细节。
            【解决方案9】:

            将您的 UIDatepicker 设置为具有区域设置属性,这样它就不会默认为用户的区域设置。

            这里是documentation,请确保设置country, not the language

            编辑:实际上,似乎语言环境在 iOS 5.0 中已被贬低。我猜苹果认为人们不应该覆盖它。

            【讨论】:

            【解决方案10】:

            我有一个答案 您可以在将语言环境设置为 datePicker 之前对其进行自定义。

            语言环境由 (language_region) 组成

            extension UIDatePicker {
            internal func setLocale() {
                guard let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String else {
                    self.locale = LanguageManager.shared.appLocale
                    return
                }
                self.locale = Locale(identifier: "\(LanguageManager.shared.appLocale.identifier)_\(countryCode)")
               }
            }
            

            其中 LanguageManager.shared.appLocale.identifier 是选择使用的语言代码(en、ar、fr 等...)

            并像使用它

               let datePicker = UIDatePicker()
                datePicker.setLocale()
            

            这将导致语言环境,例如“fr_US” 美国是设备国家地区,因此如果用户将应用程序语言更改为法语,例如它将使用美国地区,因此它将采用 12 小时格式,尽管“fr”仅使用 24 小时格式

            【讨论】:

              【解决方案11】:

              如果我理解正确,您需要确定设备设置是 12 小时还是 24 小时格式。抱歉,如果这个解决方案有点晚了。

               -(BOOL)returnDefaultDateFormat
                 {
                     NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j"     options:0 locale:[NSLocale currentLocale]];
                     NSRange containsA = [formatStringForHours rangeOfString:@"a"];
                     BOOL hasAMPM = containsA.location != NSNotFound;
                     return hasAMPM;
              }
              

              【讨论】:

                最近更新 更多