You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 15下使用日本历法的UIDatePicker不显示纪元(年号)问题咨询

问题原因

这是iOS 15及以上版本的系统层面行为变更,不属于代码逻辑问题:苹果在iOS15中调整了UIDatePicker的日期格式化规则,当给UIDatePicker设置的calendar与当前Locale的默认历法不一致时,系统会自动省略年份前的纪元标识,只保留纯数字年份,导致日本历法仅显示30、2这类数字。

修复方案

方案1:定制匹配历法的Locale(改动最小,推荐)

你只需要在设置UIDatePicker的locale时,针对日本历法做特殊处理,构造绑定了日本历法标识的Locale对象即可,修改你reloadPickers()方法中设置locale的代码:

func reloadPickers() -> Void { 
    
    var title = timeZone?.localizedName(for: .standard, locale: locale)
    if (timeZone?.isDaylightSavingTime(for: dateTimeComplete!))! {
        title = timeZone?.localizedName(for: .daylightSaving, locale: locale)
    }
    buttonTimeZone.setTitle(title, for: .normal)

    let originalDateSecondsOnly = NSCalendar.current.dateComponents([.second], from: dateTimeComplete!)

    secondPickerView.reloadAllComponents()
    if arraySeconds?.count != 0 {
        secondPickerView.selectRow(second, inComponent: 0, animated: false)
    }
    
    let components = calendar.dateComponents([.era, .year, .month, .day, .hour, .minute], from: dateTimeComplete!)
    let dateWithoutSecond = calendar.date(from: components)

    datePicker.date     = dateWithoutSecond!
    datePicker.timeZone = timeZone!
    datePicker.calendar = calendar
    // 新增iOS15+日本历法适配逻辑
    if calendar.identifier == .japanese, #available(iOS 15, *) {
        let adjustedLocaleId = "\(locale.identifier)@calendar=japanese"
        datePicker.locale = Locale(identifier: adjustedLocaleId)
    } else {
        datePicker.locale = locale
    }
    datePicker.addTarget(self, action: #selector(DateChooserViewController.dateUpdated), for: .valueChanged)
    
    timePicker.date     = dateWithoutSecond!
    timePicker.timeZone = timeZone!
    timePicker.calendar = calendar
    // timePicker做同样的适配
    if calendar.identifier == .japanese, #available(iOS 15, *) {
        let adjustedLocaleId = "\(locale.identifier)@calendar=japanese"
        timePicker.locale = Locale(identifier: adjustedLocaleId)
    } else {
        timePicker.locale = locale
    }
    timePicker.addTarget(self, action: #selector(DateChooserViewController.timeUpdated), for: .valueChanged)
    
}

方案2:自定义UIPickerView实现日期选择

如果你的App需要支持更多历法的自定义显示效果,不想受系统UIDatePicker的行为约束,可以完全自己用UIPickerView实现日期选择器,自己格式化每个选项的显示文本,彻底掌控渲染逻辑,不会受系统版本迭代的影响。

内容的提问来源于stack exchange,提问作者tsuyoski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:06:03