Swift中如何移除日期中的时间?DateFormatter使用问题
问题描述
调用API获取到格式为yyyy-MM-dd的日期字符串,希望转换为“4 September 2024”格式,但输出仍带有时间。相关代码如下:
DateFormatter实现
var newDate:DateFormatter { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd.MM.yy" dateFormatter.dateStyle = .short dateFormatter.timeStyle = .none return dateFormatter }
JSON解析设置
decoder.dateDecodingStrategy = .iso8601
代码调用方式
Text("Release Date: \(newDate.date(from: part.releaseDate) ?? Date.now)")
当前输出仍带有时间,请问问题出在哪里?
问题分析与解决
核心问题1:DateFormatter配置冲突
同时设置dateFormat和dateStyle会导致属性互斥覆盖——设置其中一个会失效另一个的配置。想要生成“4 September 2024”格式,需单独使用dateStyle或直接指定对应dateFormat,不能混用。
核心问题2:格式化方向错误
当前代码是把字符串转成Date实例后直接输出,Swift会默认用系统完整日期时间格式渲染,自然带时间。正确逻辑是先解析API字符串为Date,再用Formatter把Date转成目标格式的字符串。
修复代码示例
- 用于解析API日期的Formatter:
var apiDateParser: DateFormatter { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }
- 用于输出目标格式的Formatter:
var displayDateFormatter: DateFormatter { let formatter = DateFormatter() // 方式1:用dateStyle直接实现目标格式 formatter.dateStyle = .long formatter.timeStyle = .none // 方式2:直接指定dateFormat // formatter.dateFormat = "d MMMM yyyy" formatter.locale = Locale(identifier: "en_US") return formatter }
- 修改后的调用逻辑:
if let date = apiDateParser.date(from: part.releaseDate) { Text("Release Date: \(displayDateFormatter.string(from: date))") } else { Text("Release Date: \(displayDateFormatter.string(from: Date.now))") }
额外说明
如果坚持用ISO8601解析,需配置解析器支持不含时间的格式:
let isoFormatter = ISO8601DateFormatter() isoFormatter.formatOptions = [.withFullDate] decoder.dateDecodingStrategy = .formatted(isoFormatter)
解析出的Date会默认是当天0点,但只要用timeStyle = .none的Formatter输出,就不会显示时间。
内容的提问来源于stack exchange,提问作者AlTheBeast
相关产品推荐
相关产品推荐

