【问题标题】:(12 or 24)Time Format ignores 24-Hour Time switch if the region is changed in device(12 或 24)如果区域在设备中更改,时间格式将忽略 24 小时时间开关
【发布时间】:2021-12-13 06:26:36
【问题描述】:

我在设备上打开了 24 小时时间开关,并针对不同时区测试 iOS 应用程序,这为我提供了正确的时间格式。

例如:

  • 23:00 PDT,如果 24 小时制开关打开
  • 如果 24 小时制开关关闭,则为太平洋夏令时间晚上 11 点

但是,如果我将设备中的地区更改为日本或法国的任何时区。我观察到时间格式忽略了 24 小时制开关并始终显示 12 小时制。 然而,如果区域设置为美国或印度,我会看到正确的结果。

func formattedCloseTime(for date: DateTimeZone) -> String {
    let formatter = dateProvider.formatter
    formatter.timeZone = date.timeZone
    formatter.locale = .autoupdatingCurrent

    let stopTimeMinutes = dateProvider.minutesOfDay(from: date.value, timeZone: date.timeZone)
//    formatter.dateFormat = stopTimeMinutes == 0
//      ? Constants.DateFormat.hourFormat
//      : Constants.DateFormat.hourMinuteFormat
    formatter.setLocalizedDateFormatFromTemplate(stopTimeMinutes == 0
                                                 ? Constants.DateFormat.hourFormat
                                                 : Constants.DateFormat.hourMinuteFormat)
    return formatter.string(from: date.value)
  }

我很惊讶为什么它只发生在少数几个地区。区域和时间格式之间有什么关系吗?我该如何解决这种情况?

注意:我不想将时间格式固定为仅 24 小时。我希望它采用用户的设备设置。

解决方案 setLocalizedDateFormatFromTemplate 的 Apple API 看起来并不适用于所有区域。因此,我考虑采用用户设置的 24 小时开关值并相应地显示格式。 您可以查看此内容以获取用户设置的 24 小时值。

var isTwentyFourHourTimeSet: Bool {
      let formatString = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
      return !formatString.contains("a")
  }

【问题讨论】:

    标签: ios swift localization datetime-format time-format


    【解决方案1】:

    您可以通过声明将日期格式锁定为 24 小时

    formatter.dateFormat = "HH:mm"
    

    【讨论】:

    • 但是,我不想将时间格式锁定为仅 24 小时。我希望它获取用户的设备设置并相应地显示它们。如果不将其完全锁定为 24 小时格式,此错误是否无法解决?
    • 您所做的是正确的,但是如果您在更改时区时面临挑战,您可以像上面那样声明时间格式,使其保持 24 小时制。我希望它有所帮助。
    • 更改时区时我不会面临任何挑战。我提到当区域改变时我得到错误的结果@abdul
    • @Txv428 上面的代码你加了吗?添加此行后您仍然得到错误的结果吗?
    • Apple API 看起来并非在所有地区都能正常工作。因此,我试图从设置中获取用户的 24 小时开关值并相应地显示格式。
    【解决方案2】:

    您可以尝试使用此代码获取 24 小时制格式

    func changeTimeFormate() {
        let dateString = "11:00 PM"
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "h:mm a"
        dateFormatter.locale = Locale(identifier: "en_US_POSIX") // fixes nil if device time in 24 hour format
        let date = dateFormatter.date(from: dateString)
    
        dateFormatter.dateFormat = "HH:mm"
        let date24 = dateFormatter.string(from: date ?? Date())
        print(date24)
    
    }
    

    【讨论】:

    • 但是,我不想将时间格式锁定为仅 24 小时。我希望它获取用户的设备设置并相应地显示它们。如果不将其完全锁定为 24 小时格式,此错误是否无法解决?
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多