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
相关产品推荐
相关产品推荐

