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

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转成目标格式的字符串。

修复代码示例

  1. 用于解析API日期的Formatter:
var apiDateParser: DateFormatter {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.locale = Locale(identifier: "en_US_POSIX")
    return formatter
}
  1. 用于输出目标格式的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
}
  1. 修改后的调用逻辑:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:05:59