时间格式化逻辑
今天:仅显示 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 的设置,要注意两点:
- 内容压缩阻力:setContentCompressionResistancePriority(.required, for: .horizontal),让时间文案在空间不足时不被压缩,优先由同行视图水平截断。
- 移除 timeLabel.sizeToFit():避免与 Auto Layout 冲突,防止布局异常。
这样时间文案会完整显示,必要时由左侧标题和副标题截断。







网友评论