很多項目中都需要顯示時間,比如聊天界面消息日期、朋友圈的說說的日期等。本文提供一個Swift下的關于時間處理的extension,即NSData的擴展,主要實現功能:
1.將時間戳格式化輸出:今天HH:mm、昨天HH:mm、星期HH:mm、年-月-日 HH:mm等方式顯示
2.比較兩個時間字符串的大小,也就是兩個時間的早晚
3.時間字符串轉換時間戳
4.時間戳轉換時間字符串的簡單方法
主要方法:
1.多樣式格式化輸出方法:
class func timeString(timeInterval:TimeInterval) -> String{
//如果服務端返回的時間戳精確到毫秒,需要除以1000,否則不需要
let date:NSDate = NSDate.init(timeIntervalSince1970: timeInterval/1000)
let formatter = DateFormatter.init()
if date.isToday() {
//是今天
formatter.dateFormat = "今天HH:mm"
return formatter.string(from: date as Date)
}else if date.isYesterday(){
//是昨天
formatter.dateFormat = "昨天HH:mm"
return formatter.string(from: date as Date)
}else if date.isSameWeek(){
//是同一周
let week = date.weekdayStringFromDate()
formatter.dateFormat = "\(week)HH:mm"
return formatter.string(from: date as Date)
}else{
formatter.dateFormat = "yyyy-MM-dd HH:mm"
return formatter.string(from: date as Date)
}
}
2.時間字符串比較早晚
class func compareTime(startTime:NSString,endTime:NSString) -> ComparisonResult{
return startTime.compare(endTime as String)
}
3.時間字符串轉換時間戳:
class func timeStrChangeToTimeInterval(startTime:String,dateFormat:String?) -> TimeInterval {
let formatter = DateFormatter.init()
if dateFormat == nil {
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
}else{
formatter.dateFormat = dateFormat
}
let date = formatter.date(from: startTime)! as NSDate
return date.timeIntervalSince1970
}
4.時間戳轉換時間字符串簡單方法
class func timeIntervalChangeToTimeStr(timeInterval:TimeInterval,dateFormat:String?) -> String {
//如果服務端返回的時間戳精確到毫秒,需要除以1000,否則不需要
let date:NSDate = NSDate.init(timeIntervalSince1970: timeInterval/1000)
let formatter = DateFormatter.init()
if dateFormat == nil {
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
}else{
formatter.dateFormat = dateFormat
}
return formatter.string(from: date as Date)
}
以上提供的主要方法以類方法的方式提供,方便項目調用,當然也可以直接用對象方法,因為在Swift中如果方法前面不加訪問限制的話,是全局的,比如在“格式化輸出方法”調用的方法可以直接這樣寫:
//是否為今天
func isToday() -> Bool {
let calendar = Calendar.current
//當前時間
let nowComponents = calendar.dateComponents([.day,.month,.year], from: Date() )
//self
let selfComponents = calendar.dateComponents([.day,.month,.year], from: self as Date)
return (selfComponents.year == nowComponents.year) && (selfComponents.month == nowComponents.month) && (selfComponents.day == nowComponents.day)
}
//是否是昨天
func isYesterday() -> Bool {
let calendar = Calendar.current
//當前時間
let nowComponents = calendar.dateComponents([.day], from: Date() )
//self
let selfComponents = calendar.dateComponents([.day], from: self as Date)
let cmps = calendar.dateComponents([.day], from: selfComponents, to: nowComponents)
return cmps.day == 1
}
//是否同一周
func isSameWeek() -> Bool {
let calendar = Calendar.current
//當前時間
let nowComponents = calendar.dateComponents([.day,.month,.year], from: Date() )
//self
let selfComponents = calendar.dateComponents([.weekday,.month,.year], from: self as Date)
return (selfComponents.year == nowComponents.year) && (selfComponents.month == nowComponents.month) && (selfComponents.weekday == nowComponents.weekday)
//日期轉換星期
func weekdayStringFromDate() -> String {
let weekdays:NSArray = ["星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
var calendar = Calendar.init(identifier: .gregorian)
let timeZone = TimeZone.init(identifier: "Asia/Shanghai")
calendar.timeZone = timeZone!
let theComponents = calendar.dateComponents([.weekday], from: self as Date)
return weekdays.object(at: theComponents.weekday!) as! String
}
這些方法在外部可以被調用,大家可以根據項目需要修改方法訪問權限:方法前用fileprivate、private、public等修飾。
方法調用:
調用就很簡單啦,首先將extension拖進項目,以格式化輸出時間字符串方法調用為例:
timeLabel.text = NSDate.timeString(timeInterval: "1504340026000")
ps:關于時間處理的需求千奇百怪,大家可以根據需要擴展或修改一些方法,也歡迎大家跟我交流,共同進步。