前言
我們有時候做項目從網(wǎng)絡回調的時間數(shù)據(jù)并不是我們想要的類型曹锨,而是,這種格式的Sat Dec 03 19:56:38 +0800 2016
,而我們需要轉成我們需要的時間例如: xx分鐘前/xx小時前/xx天前
OC
主要代碼及思路
- 建立NSDate的分類舵盈,創(chuàng)建兩個方法一個返回NSDate毡咏,一個返回我們需要的時間格式
/** 獲取到的時間字符串轉成NSDate */
+ (NSDate * )timeStringToDate: (NSString *)timeString;
/** 把NSDate轉成自己需要的時間格式 */
- (NSString *)dateToRequiredString;
- 方法的實現(xiàn)驮宴,因為會用到
NSDateFormatter
和NSCalendar
這兩個類,而這兩個類初始化的時候會非常耗時間血当,并且我們可能在不同的模塊都會用到處理過后的時間幻赚,所以創(chuàng)建成單例
/** calender單例 */
+ (instancetype)sharedCalender;
/** formatter單例 */
+ (instancetype)sharedFormatter;
- NSDate的方法:
1.返回NSDate
+ (NSDate *)timeStringToDate: (NSString *)timeString {
/** /// "Sat Dec 03 19:56:38 +0800 2016",根據(jù)回調的時間字符串制定不一樣的日期格式 */
NSString * formatterString = @"EEE MMM dd HH:mm:ss zzz yyyy";
/** DateFormatter, Calendar初始化比較消耗內存, 定義成單例 */
[HHDateFormatter sharedFormatter].dateFormat = formatterString;
/** 指定區(qū)域,真機一定要指定 */
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] dateFromString: timeString];
}
2.返回需要的時間格式,使用NSCalender的方法進行判斷
- (NSString *)dateToRequiredString {
if ([[HHCalender sharedCalender] isDateInToday:self]) {
//如果是今天
int seconds = [[NSDate date] timeIntervalSinceDate:self];
if (seconds < 60) {
return @"剛剛";
} else if (seconds < 60 * 60) {
return [NSString stringWithFormat:@"%d分鐘前", seconds / 60];
} else {
return [NSString stringWithFormat:@"%d小時前", seconds / 3600];
}
} else if ([[HHCalender sharedCalender] isDateInYesterday:self]) {
//如果是昨天 10: 10
[HHDateFormatter sharedFormatter].dateFormat = @"昨天 HH:mm";
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] stringFromDate:self];
} else {
//首先要取到今年是哪一年 2016
//再取到當前的date是哪一年, 再做比較
NSInteger thisYear = [[HHCalender sharedCalender] component:NSCalendarUnitYear fromDate: [NSDate date]];
NSInteger dateYear = [[HHCalender sharedCalender] component:NSCalendarUnitYear fromDate: self];
//是今年
if (thisYear == dateYear) {
[HHDateFormatter sharedFormatter].dateFormat = @"MM-dd HH:mm";
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] stringFromDate:self];
}
//往年
else {
[HHDateFormatter sharedFormatter].dateFormat = @"yyyy-MM-dd HH:mm";
[HHDateFormatter sharedFormatter].locale = [NSLocale localeWithLocaleIdentifier: @"en"];
return [[HHDateFormatter sharedFormatter] stringFromDate:self];
}
}
}
Swift
- 實現(xiàn)的思路與OC的一致臊旭,把
DateFormatter
和Calendar
定義成全局常量落恼,這樣在哪里訪問到的都是同一個常量,和方法寫在同一個文件离熏,總共一個文件搞定
//DateFormatter, Calendar初始化比較消耗內存,一般定義成常量
let dateFormat = DateFormatter()
let calendar = Calendar.current
extension Date {
/// 在Swift3.0中, 分類里面的類方法,需要使用 static
static func timeStringToDate(timeString: String) -> Date {
/// "Sat Dec 03 19:56:38 +0800 2016",根據(jù)回調的時間字符串制定不一樣的日期格式
dateFormat.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"
/// 指定區(qū)域佳谦,真機一定要指定
dateFormat.locale = Locale(identifier: "en")
/// 把時間字符串,轉日期
return dateFormat.date(from: timeString)!
}
func dateToShowTime() -> String {
if calendar.isDateInToday(self) {
/// 間隔秒數(shù)
let timeInterval = Int(Date().timeIntervalSince(self))
/// 如果小于60秒
if timeInterval < 60 {
return "剛剛"
}
/// 小于1小時
if timeInterval < 60 * 60 {
return "\(timeInterval / 60)分鐘前"
}
/// 小于1天滋戳,大于1小時
return "\(timeInterval / 3600)小時前"
}
/// 如果是昨天
if calendar.isDateInYesterday(self) {
dateFormat.dateFormat = "昨天 HH:mm "
} else {
/// 如果不是昨天
let year = calendar.component(.year, from: self)
let thisYear = calendar.component(.year, from: Date())
/// 如果是今年
if year == thisYear {
dateFormat.dateFormat = "MM-dd HH:mm"
} else {
dateFormat.dateFormat = "yyyy-MM-dd HH:mm"
}
}
dateFormat.locale = Locale(identifier: "en")
/// 返回需要的時間字符串
return dateFormat.string(from: self)
}
}
使用
NSString *timeString = @"Mon Dec 05 11:56:38 +0800 2016";
NSDate *timeDate = [NSDate timeStringToDate:timeString];
NSLog(@"--%@",timeDate);
NSString *requiredString = [timeDate dateToRequiredString];
NSLog(@"--%@",requiredString);