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

Swift DateFormatter格式化部分日期字符串返回Null问题求助

解决DateFormatter解析"2018-03-22"返回nil的问题

嘿,这个坑我之前踩过!你遇到的问题大概率是DateFormatter的Locale和时区设置导致的,尤其是2018年3月22日这个日期在部分地区涉及夏令时切换,再加上默认Locale的不确定性,就会出现解析失败的情况。

直接解决方案

修改你的代码,给DateFormatter加上固定的Locale和明确的时区:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // 核心修复点
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) // 确保时区一致,避免夏令时影响
let targetDate = dateFormatter.date(from: "2018-03-22") // 现在应该能正常拿到Date对象了

为什么会出现这个问题?

  1. Locale的坑:默认情况下DateFormatter会使用系统当前的Locale,而有些地区的Locale对yyyy-MM-dd这种ISO标准格式的解析逻辑有差异,比如会自动识别为本地日期格式,导致解析失败。en_US_POSIX是一个固定的、不随系统地区变化的Locale,专门用于解析/生成标准格式的日期字符串。
  2. 夏令时的影响:2018年3月22日在部分欧洲地区(比如英国)是夏令时开始的日子,当天的00:00到01:00会被跳过(直接从21日的23:59跳到22日的01:00)。如果你的DateFormatter使用的是这些地区的时区,解析"2018-03-22"时会默认尝试解析为当天的00:00,而这个时间点在该时区不存在,所以返回nil。设置GMT时区可以避开这个问题,因为GMT没有夏令时。

额外小提示

如果你只是解析ISO格式的日期,也可以考虑使用ISO8601DateFormatter,它专门处理这种标准格式,不需要手动设置太多参数:

let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = .withFullDate
let targetDate = isoFormatter.date(from: "2018-03-22")

这个方法更简洁,也能避免很多Locale和时区的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:43:04