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

Swift实现Date数组转String数组?附周日期获取compactMap代码

嘿,这个问题我熟!要把Date数组转成String数组,核心就是用Swift的DateFormatter来做日期格式化,我给你两种实用的方案:

方案1:直接修改原函数返回字符串数组

如果你不需要保留原有的[Date]返回值,可以直接在函数里完成转换,一步到位:

func getCurrentWeekAsStrings() -> [String] {
    let calendar = Calendar.current
    let today = calendar.startOfDay(for: Date())
    let dayOfWeek = calendar.component(.weekday, from: today)
    let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: today)!
    
    // 初始化日期格式化器
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd" // 这里可以自定义格式,比如"EEEE, MMM d"显示完整周几+日期
    dateFormatter.locale = Locale.current // 适配系统语言,比如中文环境显示"星期一"而非"Monday"
    
    // 先拿到Date数组,再转成字符串数组
    return (weekdays.lowerBound ..< weekdays.upperBound)
        .compactMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: today) }
        .map { dateFormatter.string(from: $0) }
}

方案2:保留原函数,单独做转换

如果还需要用到原函数返回的[Date]数组,可以拆分出一个专门的转换函数,灵活性更高:

// 保留你原来的获取日期数组的函数
func getCurrentWeek() -> [Date]{
    let calendar = Calendar.current
    let today = calendar.startOfDay(for: Date())
    let dayOfWeek = calendar.component(.weekday, from: today)
    let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: today)!
    return (weekdays.lowerBound ..< weekdays.upperBound)
        .compactMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: today) }
}

// 通用的日期转字符串函数
func convertDatesToStrings(_ dates: [Date], format: String = "yyyy-MM-dd") -> [String] {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    dateFormatter.locale = Locale.current
    return dates.map { dateFormatter.string(from: $0) }
}

// 使用示例
let weekDates = getCurrentWeek()
let weekStrings = convertDatesToStrings(weekDates)
// 也可以指定自定义格式,比如显示周几和日期:
// let weekStrings = convertDatesToStrings(weekDates, format: "EEEE, MMM d")

小提示:优化性能

DateFormatter的创建开销不小,如果你的函数会被频繁调用,建议把它做成静态属性,避免重复创建:

// 把格式化器定义为静态常量
private static let dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.locale = Locale.current
    return formatter
}()

func getCurrentWeekAsStrings() -> [String] {
    // ... 前面的日期获取代码 ...
    return dates.map { Self.dateFormatter.string(from: $0) }
}

你可以根据自己的需求调整dateFormat的格式,比如:

  • "yyyy-MM-dd" → 2024-10-05
  • "EEEE" → 星期一(中文环境)/ Monday(英文环境)
  • "MMM d, yyyy" → Oct 5, 2024(英文)/ 10月5日, 2024(中文)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:47:34