Swift DateFormatter转换12月下旬日期时年份异常自增问题求助
问题根源
这是日期格式化符的经典误用问题,代码从设计之初就存在隐患,并非偶发边界Bug。
Foundation 框架的日期格式化规则中:
- 大写
YYYY是ISO 周历年标识,对应的是日期所在周所属的年份,不是公历年。每年12月底的日期如果属于下一年的第一周,用YYYY格式化就会出现年份跳变,你遇到的12月26日-31日正好符合这个场景:2021年12月26日所属的周属于2022年的ISO第一周,所以格式化后年份会变成2022。 - 小写
yyyy才是日常使用的公历年(日历年)标识,符合你业务场景的需求。
修复方案
- 首要修改
DateFormats枚举中的格式定义,把大写YYYY替换为小写yyyy:
enum DateFormats: String { case api = "yyyy-MM-dd HH:mm:ss" // 其余case同步检查,所有需要展示日历年的场景都要把YYYY替换为yyyy }
- 额外的线上稳定性优化建议:
- 每次调用都新建
DateFormatter实例的开销极高,高频调用会有明显性能损耗,建议按照「格式+时区」的组合建立缓存池复用实例。 - 解析服务端返回的固定格式日期时,建议给
DateFormatter指定locale = Locale(identifier: "en_US_POSIX"),避免用户修改系统区域格式(比如开启12小时制、自定义日期格式)导致解析失败,这也是常见的线上隐形bug。 - 只有需要处理周维度的业务时才需要用到
YYYY,普通年月日展示、日期解析统一用yyyy即可完全规避年份跳变问题。
内容的提问来源于stack exchange,提问作者Sorin Miroiu
相关产品推荐
相关产品推荐

