// // DateExt.swift // Crush // // Created by Leon on 2025/7/15. // import Foundation import SwiftDate extension Date { /// 获取当前 时间戳 - 默认毫秒 var timeStamp: Int { let timeInterval: TimeInterval = timeIntervalSince1970 let millisecond = Int(round(timeInterval * 1000)) return millisecond } var timeStampInSeconds: Int { let timeInterval: TimeInterval = timeIntervalSince1970 let timeStamp = Int(timeInterval) return timeStamp } /// 获取当前 毫秒级 时间戳 - 13位 var milliStamp: Int { let timeInterval: TimeInterval = timeIntervalSince1970 let millisecond = Int(round(timeInterval * 1000)) return millisecond } func toString(dateFormat: String = "yyyy-MM-dd HH:mm:ss") -> String { let fm = DateFormatter() fm.dateFormat = dateFormat fm.locale = Locale(identifier: Languages.localRegionCode()) return fm.string(from: self) } static func dateFromMilliseconds(_ ms: Int64) -> Date { return Date(timeIntervalSince1970: TimeInterval(ms) / 1000) } static func timerStyle(style: TimerStyle, millisecond: Int) -> String { return Date.timerStyle(style: style, second: millisecond / 1000) } /// second: 秒 static func timerStyle(style: TimerStyle, second: Int) -> String { if second == 0 { return "" } let interval = TimeInterval(second) let date = Date(timeIntervalSince1970: interval) switch style { case .WDMYHMS: return date.toString(dateFormat: "E, d MMM yyyy HH:mm:ss") case .DMYHMS: return date.toString(dateFormat: "d MMM yyyy HH:mm:ss") case .DMYHM: return date.toString(dateFormat: "d MMM yyyy HH:mm") case .DMHM: return date.toString(dateFormat: "d MMM HH:mm") case .DMY: return date.toString(dateFormat: "d MMM yyyy") case .DM: return date.toString(dateFormat: "d MMM") case .MY: return date.toString(dateFormat: "MMM yyyy") case .HM: return date.toString(dateFormat: "HH:mm") case .IMLIST: return Date.timerStyleForIM(style: .IMLIST, second: second) case .IMCHAT: return Date.timerStyleForIM(style: .IMCHAT, second: second) case .EVENTEND: return date.toString(dateFormat: "d MMM HH:mm") default: return "-" } } /// IM类型的时间格式 xx(分钟\小时\天\周\月\年)前 /// - Parameter timeStamp: 时间戳 13位 /// - Returns: String private static func timerStyleForIM(style: TimerStyle, second: Int) -> String { let interval = TimeInterval(second) let last = Date(timeIntervalSince1970: interval) // 今天 if last.isToday { return last.toString(dateFormat: "HH:mm") } switch style { case .IMLIST: // 昨天 if last.isYesterday { return "Yesterday" } // 本年不带年份 if last.compare(.isThisYear) { return last.toString(dateFormat: "d MMM") } return last.toString(dateFormat: "d MMM yyyy") case .IMCHAT: // 昨天 if last.isYesterday { return "Yesterday" + " " + last.toString(dateFormat: "HH:mm") } // 本年不带年份 if last.compare(.isThisYear) { return last.toString(dateFormat: "d MMM HH:mm") } return last.toString(dateFormat: "d MMM yyyy HH:mm") default: return "" } } } enum TimerStyle { case WDMYHMS case DMYHMS case DMYHM case DMHM case DMY case DM case MY case HM case IMLIST case IMCHAT case PUBLISH case COMMENT case EVENTEND } extension TimeInterval { /// 格式化录音时长:<1分钟显示s,>=1分钟显示 m:ss var imAIaudioDurationString: String { // let totalSeconds = Int(self) // let minutes = totalSeconds / 60 // let seconds = totalSeconds % 60 // // if minutes > 0 { // // 显示分钟:秒(秒补零) // return String(format: "%d:%02d''", minutes, seconds) // } else { // // 小于1分钟只显示秒 // return "\(seconds)''" // } if self < 1 { return "1''" } let totalSeconds = Int(self.rounded()) if totalSeconds < 60 { return "\(totalSeconds)''" } let minutes = totalSeconds / 60 let seconds = totalSeconds % 60 if seconds == 0 { return "\(minutes)'" } return String(format: "%d'%02d''", minutes, seconds) } }