OC和Swift的NSDate時間的簡單整理:
+(我們通過網(wǎng)絡(luò)數(shù)據(jù)請求獲得的時間是不能直接顯示到客戶端的住闯,必須經(jīng)過處理懒棉。用到的時候一般都會配合分類來使用,如先判斷是否為今年抒蚜,今天悼院,昨天等判没,在進行時間差的比較啊送。為了代碼的封裝性和易用性。我們通常把比較時間差代碼封裝到分類篮洁,這些都是已經(jīng)封裝好的代碼涩维。詳情請看下面:)
時間未處理處理之前:
時間經(jīng)過處理之后:
-1 OC版的時間處理
- 服務(wù)器返回的格式: 2017-01-13 18:58:02
################################ .h文件 ##################################
// NSDate+MGExtension.h
// Created by ming on 14/11/25.
// Copyright ? 2014年 ming. All rights reserved.
#import <Foundation/Foundation.h>
@interface NSDate (MGExtension)
/**
* 比較self和from時間的差值
* 返回一個NSDateComponents:包括年月日時分秒
*/
- (NSDateComponents *)mg_deltaFrom:(NSDate *)from;
/**
* 是否為今年
*/
- (BOOL)mg_isThisYear;
/**
* 是否為今天
*/
- (BOOL)mg_isToday;
/**
* 是否為昨天
*/
- (BOOL)mg_isYesterday;
@end
################################ .m文件 ##################################
// NSDate+MGExtension.m
// Created by ming on 14/11/25.
// Copyright ? 2014年 ming. All rights reserved.
/**
* 這是一個處理時間的分類(用于計算服務(wù)器返回的時間與當(dāng)前時間比較)
* 分為:
* 今年 非今年
* 今天 昨天 明天
* 幾小時前 幾分鐘前 一分鐘以內(nèi)
*/
#import "NSDate+MGExtension.h"
@implementation NSDate (MGExtension)
- (NSDateComponents *)mg_deltaFrom:(NSDate *)from{
// 獲取日歷
NSCalendar *calendar = [NSCalendar currentCalendar];
// 比較時間
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
return [calendar components:unit fromDate:from toDate:self options:0];
}
/** 是否是今年 */
- (BOOL)mg_isThisYear{
// 獲取日歷
NSCalendar *calendar = [NSCalendar currentCalendar];
// 比較時間
NSInteger nowYear = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
NSInteger selfYear = [calendar component:NSCalendarUnitYear fromDate:self];
// NSInteger之間的比較
return nowYear == selfYear;
}
/** 是否是今天 */
- (BOOL)mg_isToday{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSString *nowString = [fmt stringFromDate:[NSDate date]];
NSString *selfString = [fmt stringFromDate:self];
// 字符串之間的比較
return [nowString isEqualToString:selfString];
// return [nowString isEqual:selfString];
}
/** 是否是昨天 */
- (BOOL)mg_isYesterday{
// 去除掉時分秒
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth |
NSCalendarUnitDay;
NSDateComponents *coms = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
return coms.year == 0
&& coms.month == 0
&& coms.day == 1;
}
/** 是否是明天 (注:這個只是擴展,實際開發(fā)不會用到是否是明天的) */
- (BOOL)mg_isTomorrow{
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth |
NSCalendarUnitDay;
NSDateComponents *coms = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
return coms.year == 0
&& coms.month == 0
&& coms.day == -1;
}
@end
外部調(diào)用(OC)
/**
* 拿到服務(wù)器返回的時間和當(dāng)前時間進行比較
* 返回一個字符串時間
*/
- (NSString *)created_at{
// 1.創(chuàng)建NSDateFormatter對象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 1.1并日期格式化
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 1.2拿到服務(wù)器返回的時間
NSDate *creat = [fmt dateFromString:_created_at];
// 2.判斷服務(wù)器返回的時間
if (creat.mg_isThisYear) { // 今年
if (creat.mg_isToday) { // 今天
NSDateComponents *coms = [[NSDate date] mg_deltaFrom:creat];
if (coms.hour > 1) { // 幾小時前
return [NSString stringWithFormat:@"%zd小時前",coms.hour];
}else if (coms.minute > 1){ // 幾分鐘前
return [NSString stringWithFormat:@"%zd分鐘前",coms.minute];
}else{ // 剛剛
return @"剛剛";
}
}else if (creat.mg_isYesterday){// 昨天
fmt.dateFormat = @"昨天 HH:mm:ss";
return [fmt stringFromDate:creat];
}else{ // 今年其他日子
fmt.dateFormat = @"MM-dd HH:mm:ss";
return [fmt stringFromDate:creat];
}
}else{ // 非今年
return _create_time;
}
}
-
注意:時間的格式要根據(jù)服務(wù)器返回的時間類型,要不然會轉(zhuǎn)換失敗
- 日期格式化 根據(jù)服務(wù)器返回的時間類型確定
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
- 日期格式化 根據(jù)服務(wù)器返回的時間類型確定
-
2 Swift2.2版的時間處理
NSDate+Extension.swift
Created by ming on 16/2/1.
Copyright ? 2016年 ming. All rights reserved.
import UIKit
extension NSDate {
/**
* 根據(jù)字符串轉(zhuǎn)換時間
*/
class func dateWithString(str: String) -> NSDate? {
// 1.創(chuàng)建時間格式化對象
let formatter = NSDateFormatter()
// 2.指定時間格式
formatter.dateFormat = "EEE MM dd HH:mm:ss Z yyyy"
// 3.指定時區(qū)
formatter.locale = NSLocale(localeIdentifier: "en")
// 4.轉(zhuǎn)換時間
return formatter.dateFromString(str)
}
/**
* 獲取當(dāng)前時間的格式
* 返回一個字符串時間
*/
func desStr() -> String{
// 0.1.創(chuàng)建一個日歷類
let calendar = NSCalendar.currentCalendar()
// 0.2.利用日歷類從指定時間從獲取指定的組成成分
// 1.1.創(chuàng)建時間格式化對象
let formatter = NSDateFormatter()
// 1.2.指定時區(qū)
formatter.locale = NSLocale(localeIdentifier: "en")
if calendar.isDateInToday(self){ // 2.1判斷是否是今天
// 獲取當(dāng)前時間與指定時間的差值
let res = Int(NSDate().timeIntervalSinceDate(self))
if res < 60 { // 剛剛
return "剛剛"
}else if res < 60 * 60 { // 多少分鐘前
return "\(res/60)分鐘前"
}else if res < 24 * 60 * 60 { // 多少小時前
return "\(res/(60*60))小時前"
}
}else if calendar.isDateInYesterday(self){ // 2.2判斷是否是昨天
formatter.dateFormat = "昨天 HH:mm"
return formatter.stringFromDate(self)
}
/// 如果能來到這里瓦阐,肯定不是今天或者昨天
let comps = calendar.components(NSCalendarUnit.Year, fromDate: self, toDate: NSDate(), options: NSCalendarOptions(rawValue:0))
if comps.year < 1 { // 2.3一年以內(nèi)
formatter.dateFormat = "MM-dd HH:mm"
return formatter.stringFromDate(self)
}else{ // 2.4更早時間
formatter.dateFormat = "yyyy-MM-dd HH:mm"
return formatter.stringFromDate(self)
}
}
}
外部調(diào)用(Swift)
// 設(shè)置以及處理過的時間
var timeText: String?
{
// 守衛(wèi)
guard let timeStr = status?.created_at else{
return ""
}
guard let date = NSDate.dateWithString(timeStr) else {
return ""
}
return date.desStr()
}
-
3 Swift3.x版的時間處理
extension Date {
/**
* 根據(jù)字符串轉(zhuǎn)換時間
*/
static func dateWithString(str: String) -> Date? {
// 1.創(chuàng)建時間格式化對象
let formatter = DateFormatter()
// 2.指定時間格式
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
// 3.指定時區(qū)
formatter.locale = Locale(identifier: "en")
// 4.轉(zhuǎn)換時間
return formatter.date(from: str)
}
/**
* 獲取當(dāng)前時間的格式
* 返回一個字符串時間
*/
func desStr() -> String{
// 0.1.創(chuàng)建一個日歷類
let calendar = NSCalendar.current
// 0.2.利用日歷類從指定時間從獲取指定的組成成分
// 1.1.創(chuàng)建時間格式化對象
let formatter = DateFormatter()
// 1.2.指定時區(qū)
formatter.locale = Locale(identifier: "en") //Locale(identifier: "en")
if calendar.isDateInToday(self){ // 2.1判斷是否是今天
// 獲取當(dāng)前時間與指定時間的差值
let res = Int(Date().timeIntervalSince(self))
if res < 60 { // 剛剛
return "剛剛"
}else if res < 60 * 60 { // 多少分鐘前
return "\(res/60)分鐘前"
}else if res < 24 * 60 * 60 { // 多少小時前
return "\(res/(60*60))小時前"
}
}else if calendar.isDateInYesterday(self){ // 2.2判斷是否是昨天
formatter.dateFormat = "昨天 HH:mm"
return formatter.string(from: self)
}
/// 如果能來到這里蜗侈,肯定不是今天或者昨天
let comps = calendar.dateComponents([.year], from: self, to: Date())
if comps.year! < 1 { // 2.3一年以內(nèi)
formatter.dateFormat = "MM-dd HH:mm"
return formatter.string(from: self)
}else{ // 2.4更早時間
formatter.dateFormat = "yyyy-MM-dd HH:mm"
return formatter.string(from: self)
}
}
}