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

如何在Swift扩展中实现日期与当前时间差计算及友好展示

实现日期相对时间显示方案

需求说明

将API获取的JSON日期字符串转为Date类型后,计算该日期与当前日期的时间差:

  • 时间差小于24小时时,显示「n小时前」
  • 时间差≥24小时时,显示「n天前」

实现步骤

1. 扩展Date类,添加相对时间计算方法

在现有Date扩展中新增方法,直接返回格式化后的相对时间字符串:

extension Date {
    // 保留原有方法
    func toString(withFormat format: String = "MM.dd") -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.string(from: self)
    }
    
    func toStringCoin(withFormat format: String = "HH") -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.string(from: self)
    }
    
    // 新增:计算与当前时间的相对差
    func relativeTimeString() -> String {
        let currentDate = Date()
        let timeInterval = currentDate.timeIntervalSince(self)
        
        let hours = Int(timeInterval / 3600)
        if hours < 24 {
            return "\(hours)小时前"
        } else {
            let days = hours / 24
            return "\(days)天前"
        }
    }
}

2. 确保日期字符串正确转换为Date

根据API返回的日期格式,调用对应的String扩展方法完成转换:

// 示例:如果API返回格式是"MM/dd/yyyy HH:mm"
guard let newsDate = newsModel.date.toDateCoin() else {
    // 处理转换失败的情况,比如返回默认文本
    return Text("未知时间")
}

3. 修改调用代码,直接使用相对时间

替换原有调用逻辑,直接调用新增的relativeTimeString()方法:

// 当newsDate是Date类型时
Text(newsDate.relativeTimeString())

// 可选:如果想直接从字符串一步获取相对时间,扩展String类
extension String {
    func toDate(withFormat format: String = "MM/dd/yyyy")-> Date?{
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.date(from: self)
    }

    func toDateCoin(withFormat format: String = "MM/dd/yyyy HH:mm")-> Date?{
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.date(from: self)
    }
    
    // 新增:直接从日期字符串获取相对时间
    func relativeTimeString(withFormat format: String = "MM/dd/yyyy HH:mm") -> String {
        guard let date = self.toDateCoin(withFormat: format) else {
            return "未知时间"
        }
        return date.relativeTimeString()
    }
}

// 此时调用方式更简洁:
Text(newsModel.date.relativeTimeString())

注意事项

  • 时区适配:如果API返回的是UTC时间,需要给DateFormatter设置timeZone = TimeZone(identifier: "UTC"),避免时间转换偏差
  • 边界优化:如果时间差小于1小时,当前逻辑会显示「0小时前」,可根据需求修改为「刚刚」等友好提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:45:28