美文网首页
Swift 时间字符串转:今天、昨天...

Swift 时间字符串转:今天、昨天...

作者: 大成小栈 | 来源:发表于2026-03-18 09:20 被阅读0次
时间格式化逻辑

今天:仅显示 HH:mm
昨天:昨天 HH:mm / Yesterday HH:mm
前天:前天 HH:mm / 2d ago HH:mm
更早:MM-dd HH:mm

private static func formatTimeText(_ sendTime: String?) -> String {
       guard let raw = sendTime, !raw.isEmpty else { return "--" }
       let formatter = DateFormatter()
       formatter.timeZone = .current
       if raw.contains(" ") {
           formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
       } else {
           formatter.dateFormat = "yyyy-MM-dd"
       }
       guard let date = formatter.date(from: raw) else { return raw }

       let calendar = Calendar.current
       let today = calendar.startOfDay(for: Date())
       let messageDay = calendar.startOfDay(for: date)

       let timeFormatter = DateFormatter()
       timeFormatter.dateFormat = "HH:mm"
       timeFormatter.timeZone = .current
       let timePart = timeFormatter.string(from: date)

       if messageDay == today {
           return timePart
       } else if let yesterday = calendar.date(byAdding: .day, value: -1, to: today), messageDay == yesterday {
           return "\("msg_time_yesterday".localized) \(timePart)"
       } else if let dayBeforeYesterday = calendar.date(byAdding: .day, value: -2, to: today), messageDay == dayBeforeYesterday {
           return "\("msg_time_day_before".localized) \(timePart)"
       } else {
           let dateFormatter = DateFormatter()
           dateFormatter.dateFormat = "MM-dd"
           dateFormatter.timeZone = .current
           return dateFormatter.string(from: date) + " " + timePart
       }
   }

对于 timeLabel 的设置,要注意两点:

  1. 内容压缩阻力:setContentCompressionResistancePriority(.required, for: .horizontal),让时间文案在空间不足时不被压缩,优先由同行视图水平截断。
  2. 移除 timeLabel.sizeToFit():避免与 Auto Layout 冲突,防止布局异常。

这样时间文案会完整显示,必要时由左侧标题和副标题截断。

相关文章

网友评论

      本文标题:Swift 时间字符串转:今天、昨天...

      本文链接:https://www.haomeiwen.com/subject/mgstsstx.html