iOS日期處理

服務(wù)器返回的時(shí)間是字符串撒妈,手機(jī)獲取的時(shí)間是NSDate忆绰,需要進(jìn)行轉(zhuǎn)換怖竭。

凡是日期處理,這三個(gè)類足夠了

  • NSDate
  • NSDateFormatter
  • NSCalendar

NSDate


// 獲取當(dāng)前時(shí)間(0時(shí)區(qū))
NSDate *now = [NSDate date];

NSDateFormatter


NSDateFormatter類的作用

NSString * -> NSDate *
NSDate * -> NSString *

NSString -> NSDate

  1. 創(chuàng)建日期格式化類
  2. 設(shè)置日期格式
  • 如果是歐美時(shí)間,設(shè)置語(yǔ)言代碼
  1. NSString轉(zhuǎn)NSDate

服務(wù)器返回的是普通格式時(shí)間

// 時(shí)間字符串
NSString *string = @"2015-12-10 19:25:07";

// 日期格式化對(duì)象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

// 日期格式
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

// NSString -> NSDate
NSDate *date = [fmt dateFromString:string];

服務(wù)器返回的是歐美時(shí)間

在iOS中設(shè)置歐美日期晶乔,需要設(shè)置語(yǔ)言區(qū)域

// 時(shí)間字符串
NSString *string = @"Tue May 31 17:46:55 +0800 2011";

// 日期格式化對(duì)象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

// 日期格式
fmt.dateFormat = @"EEE MMM dd HH:mm:SS Z yyyy";
// 語(yǔ)言代碼
fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

// NSString -> NSDate
NSDate *date = [fmt dateFromString:string];
```

###服務(wù)器返回的是時(shí)間戳
- 時(shí)間戳:從1970-01-01 00:00:00開始走過(guò)的毫秒數(shù)

```objc
// iOS中接收的參數(shù)是秒珍坊,需要將時(shí)間戳的毫秒轉(zhuǎn)成秒
[NSDate dateWithTimeIntervalSince1970:string.longLongValue / 1000.0];
```

##NSData -> NSString
```objc
// 日期對(duì)象
NSDate *date = [NSDate date];

// 日期格式化對(duì)象
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

// 日期格式
fmt.dateFormat = @"yyyy年MM月dd日 HH:mm:ss";

// NSDate -> NSString
NSString *string = [fmt stringFromDate:date];
```
不論是NSString轉(zhuǎn)NSDate,還是NSDate轉(zhuǎn)NSString正罢,進(jìn)行轉(zhuǎn)換時(shí)候,都需要`設(shè)置格式`驻民。

##日期比較

###兩個(gè)NSDate之間大小比較
```objc
/*
 NSComparisonResult取值
 NSOrderedAscending = -1L, 升序(右>左)
 NSOrderedSame, 相同
 NSOrderedDescending, 降序(右<左)
*/
NSComparisonResult result = [nowDate compare:createdAtDate];

switch (result) {
    case NSOrderedSame:
        NSLog(@"equal");
        break;
    case NSOrderedAscending:
        NSLog(@"now < createdAt");
        break;
    case NSOrderedDescending:
        NSLog(@"now > createdAt");
        break;
        
    default:
        break;
}
```

###獲取時(shí)間間隔差值
```objc
// 手機(jī)當(dāng)前時(shí)間和1970年的時(shí)間間隔(s)
NSDate *nowDate = [NSDate date];
NSTimeInterval interval = [nowDate timeIntervalSince1970];

// 手機(jī)當(dāng)前事件和createdAtDate之間的時(shí)間間隔(s)
NSTimeInterval interval = [nowDate timeIntervalSinceDate:createdAtDate];
```
獲取兩個(gè)時(shí)間間隔之后翻具,想要轉(zhuǎn)換成自然語(yǔ)言時(shí)間間隔,需要經(jīng)過(guò)計(jì)算回还,考慮到可能會(huì)有很多地方要用裆泳,抽取成分類
```objc
#import <Foundation/Foundation.h>

// 一次返回多個(gè)相關(guān)聯(lián)的值,直接用模型封裝
@interface XYDateItem : NSObject
@property (nonatomic, assign) NSInteger day;
@property (nonatomic, assign) NSInteger hour;
@property (nonatomic, assign) NSInteger minute;
@property (nonatomic, assign) NSInteger second;
@end

@interface NSDate (XYExtension)
- (XYDateItem *)xy_timeIntervalSinceDate:(NSDate *)date;
@end


#import "NSDate+XYExtension.h"

static int const secondPerMinute = 60;
static int const secondPerHour = 60 * 60;
static int const secondPerDay = 60 * 60 * 24;

@implementation XYDateItem

- (NSString *)description
{
    return [NSString stringWithFormat:@"%zd天%zd小時(shí)%zd分%zd秒", self.day, self.hour, self.minute, self.second];
}
@end

@implementation NSDate (XYExtension)

- (XYDateItem *)xy_timeIntervalSinceDate:(NSDate *)date
{
    // self和date的時(shí)間間隔
    NSTimeInterval interval = [self timeIntervalSinceDate:date];
    // 轉(zhuǎn)成整型
    int intInterval = interval;
    
    XYDateItem *item = [[XYDateItem alloc] init];
    
    item.day = intInterval / secondPerDay;
    item.hour = (intInterval % secondPerDay) / secondPerHour;
    item.minute = ((intInterval % secondPerDay) % secondPerHour) / secondPerMinute;
    item.second = ((intInterval % secondPerDay) % secondPerHour) % secondPerMinute;
    
    return item;
}
@end
```

#NSCalendar
---
通過(guò)NSCalendar類可以獲取日期的各種元素

##獲取日期某個(gè)元素(iOS8之后)
```objc
- (NSInteger)component:(NSCalendarUnit)unit fromDate:(NSDate *)date
```
##獲取日期元素
```objc
// unit傳入什么值,就獲取到什么元素,沒(méi)傳入的不獲取
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
```

##計(jì)算兩個(gè)NSDate之間的時(shí)間間隔
```objc
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
```

##判斷是不是在某一范圍
如判斷NSDate數(shù)據(jù)是不是今天/昨天/明天/周末等等
- iOS8之后NSCalendar自帶方法

```objc
// NSCalendar自帶方法, iOS8開始
- (BOOL)isDateInToday:(NSDate *)date
- (BOOL)isDateInYesterday:(NSDate *)date
- (BOOL)isDateInTomorrow:(NSDate *)date
- (BOOL)isDateInWeekend:(NSDate *)date
```

- iOS8之前自己寫方法

```objc
/** 是不是今天 */
- (BOOL)xy_isToday
{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyyMMdd";
    
    NSString *selfString = [fmt stringFromDate:self];
    NSString *nowString = [fmt stringFromDate:[NSDate date]];

    return [selfString isEqualToString:nowString];
}

/** 是不是昨天 */
- (BOOL)xy_isYesterday
{
    NSDateFormatter  *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyyMMdd";

    // 生成只有年月日的字符串
    NSString *selfString = [fmt stringFromDate:self];
    NSString *nowString = [fmt stringFromDate:[NSDate date]];
    
    // 生成只有年月日的日期對(duì)象
    NSDate *selfDate = [fmt dateFromString:selfString];
    NSDate *nowDate = [fmt dateFromString:nowString];
    
    NSCalendar *calendar = [NSCalendar xy_calendar];
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
    
    return cmps.year == 0
    && cmps.month == 0
    && cmps.day == 1;
}

/** 是不是明天 */
- (BOOL)xy_isTomorrow
{
    NSDateFormatter  *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyyMMdd";
    
    // 生成只有年月日的字符串
    NSString *selfString = [fmt stringFromDate:self];
    NSString *nowString = [fmt stringFromDate:[NSDate date]];
    
    // 生成只有年月日的日期對(duì)象
    NSDate *selfDate = [fmt dateFromString:selfString];
    NSDate *nowDate = [fmt dateFromString:nowString];
    
    NSCalendar *calendar = [NSCalendar xy_calendar];
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
    
    return cmps.year == 0
    && cmps.month == 0
    && cmps.day == -1;
}
```

##NSCalendar使用注意:
- 使用calendar過(guò)程中,currentCalendar方法在iOS8.0以上有時(shí)候會(huì)崩潰柠硕,改用calendarWithIdentifier方法工禾。
- 但是如果寫成calendarWithIdentifier的話,運(yùn)行在iOS8以下系統(tǒng)會(huì)報(bào)未找到方法的錯(cuò)誤
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝗柔,隨后出現(xiàn)的幾起案子闻葵,更是在濱河造成了極大的恐慌,老刑警劉巖癣丧,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽畔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胁编,警方通過(guò)查閱死者的電腦和手機(jī)厢钧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嬉橙,“玉大人早直,你說(shuō)我怎么就攤上這事∈锌颍” “怎么了霞扬?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我祥得,道長(zhǎng)兔沃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任级及,我火速辦了婚禮乒疏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饮焦。我一直安慰自己怕吴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布县踢。 她就那樣靜靜地躺著转绷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硼啤。 梳的紋絲不亂的頭發(fā)上议经,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音谴返,去河邊找鬼煞肾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嗓袱,可吹牛的內(nèi)容都是我干的籍救。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼渠抹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝙昙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起梧却,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奇颠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后篮幢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體大刊,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年三椿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缺菌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搜锰,死狀恐怖伴郁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛋叼,我是刑警寧澤焊傅,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布剂陡,位于F島的核電站,受9級(jí)特大地震影響狐胎,放射性物質(zhì)發(fā)生泄漏鸭栖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一握巢、第九天 我趴在偏房一處隱蔽的房頂上張望晕鹊。 院中可真熱鬧,春花似錦暴浦、人聲如沸溅话。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飞几。三九已至,卻和暖如春独撇,著一層夾襖步出監(jiān)牢的瞬間屑墨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工券勺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绪钥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓关炼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匣吊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儒拂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 目錄: 1、字符串轉(zhuǎn)換為日期色鸳; 2社痛、時(shí)間戳轉(zhuǎn)換為日期; 3命雀、日期轉(zhuǎn)換為字符串 4蒜哀、獲取日期中的年、月吏砂、日撵儿、時(shí)、分狐血、...
    金魚________閱讀 700評(píng)論 0 3
  • GitHub: https://github.com/GardenerYunEmail: gardeneryun@...
    園丁云閱讀 5,364評(píng)論 3 38
  • 日期處理 NSString 與 NSDate 轉(zhuǎn)換使用NSDateFormatter 日期格式說(shuō)明: yy: 年...
    著魔的毛豆閱讀 534評(píng)論 0 1
  • 一淀歇、先定義一個(gè)全局變量的NSTimeInterval 復(fù)制代碼 @interface ViewController...
    IOS_龍閱讀 1,137評(píng)論 0 0
  • 名字一聽就沒(méi)有想看的欲望,奈何這部劇是閱片無(wú)數(shù)的姐姐強(qiáng)烈安利給我的匈织,于是勉強(qiáng)打開瞅瞅浪默,沒(méi)想到一看牡直,就連續(xù)三晚刷到凌...
    一顆胖胖臻閱讀 1,877評(píng)論 0 0