Swift中TimeInterval转Int异常:时间戳解析日期错误求修正方案
问题:TimeInterval转日期组件方法输出错误日期
输入时间戳1720189102.0时,预期输出日期为05-07-2024,但实际输出为07-07-2024,打印结果为Optional((year: Optional(2024), month: Optional(7), day: Optional(7)))。
错误代码如下:
extension TimeInterval { func dateTimestampDividedInt(date: TimeInterval) -> (year: Int?, month: Int?, day: Int?) { let dateFormatter = DateFormatter() let dateConv = Date() dateFormatter.dateFormat = "yyyy" let year = dateFormatter.string(from: dateConv) let yearInt = Int(year) dateFormatter.dateFormat = "MM" let month = dateFormatter.string(from: dateConv) let monthInt = Int(month) dateFormatter.dateFormat = "dd" let day = dateFormatter.string(from: dateConv) let dayInt = Int(day) return (yearInt, monthInt, dayInt) } }
错误原因
代码中dateConv = Date()创建的是当前系统时间,完全没有使用传入的date参数,所以无论输入什么时间戳,返回的都是当前日期的年、月、日组件。此外,通过DateFormatter转字符串再转Int的方式冗余且容易引入格式问题。
正确实现
使用Calendar直接解析时间戳对应的日期组件,更高效可靠:
extension TimeInterval { func dateTimestampDividedInt() -> (year: Int?, month: Int?, day: Int?) { // 用当前TimeInterval实例创建对应的Date对象 let targetDate = Date(timeIntervalSince1970: self) // 获取当前日历实例 let calendar = Calendar.current // 提取年、月、日组件 let components = calendar.dateComponents([.year, .month, .day], from: targetDate) return (components.year, components.month, components.day) } }
调用示例
let timestamp = 1720189102.0 let dateComponents = timestamp.dateTimestampDividedInt() print(dateComponents) // 输出:(year: Optional(2024), month: Optional(7), day: Optional(5))
内容的提问来源于stack exchange,提问作者user26154446
相关产品推荐
相关产品推荐

