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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:59:51