首页 > 解决方案 > (12 或 24)如果区域在设备中更改,时间格式将忽略 24 小时时间开关

问题描述

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

前任:

但是,如果我将设备中的地区更改为日本或法国的任何时区。我观察到时间格式忽略了 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")
  }

标签: iosswiftlocalizationdatetime-formattime-format

解决方案


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

formatter.dateFormat = "HH:mm"

推荐阅读