服務(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
- 創(chuàng)建日期格式化類
- 設(shè)置日期格式
- 如果是歐美時(shí)間,設(shè)置語(yǔ)言代碼
- 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ò)誤