遠離懵壁,看懂這篇NSDate

UTC世界標準時間,由原子鐘計算,咱們如今使用的時間標準,UTC表示0時區。bash

GMT格林尼治時間,由英國格林尼治天文臺統一度量,經過它來區分時區。ui



時間和時間戳

得到時間經過初始化NSDate來獲取咱們須要的時間對象,轉換成string表示spa

得到時間戳經過某一個時間對象到UNIX(1970年1月1日00:00:00 UTC)時間的差值,轉換成string表示code

當前時間和UTC時間

UTC表示0時區時間是統一的時間標準,當前時間表示帶有GMT修飾的時區時間component


NSDate

初始化

NSDate *date = [NSDate new];//init方法用來初始化當前日期和UTC時間
NSDate *date = [NSDate date];//UTC時間,0時區
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0];//比標準UTC增長或減小秒
NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];//從UTC1970-01-01 00:00:00開始增長或減小秒數
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:1];//UTC從2001-01-01 00:00:00l開始增長或減小秒數
NSDate *date = [NSDate dateWithTimeInterval:interval sinceDate:date];//從指定日期開始增長或減小秒數複製代碼

時間轉時間戳

- (NSString *)getTimestamp:(NSString *)time {
    NSDateFormatter *format = [NSDateFormatter new];
    format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *date = [format dateFromString:time];
    NSInteger timeInterval = [date timeIntervalSince1970];
    NSString *timestamp = [NSString stringWithFormat:@"%ld",(long)timeInterval];
    return timestamp;
}複製代碼

時間戳轉時間

- (NSString *)getTime:(NSString *)timestamp {
    NSDateFormatter *format = [NSDateFormatter new];
    format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSTimeInterval timeInterval = [timestamp integerValue];
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSString *time = [format stringFromDate:date];
    return time;
}複製代碼

NSDate時間轉NSString時間

第一種:字符串不包含GMT時區縮寫,timeZone定義爲GMT0時區
- (void)timeString {
	NSDate *date = [NSDate date];
    NSDateFormatter *format = [NSDateFormatter new];//自定義時間標準
    format.dateFormat = @"yyy-MM-dd HH:mm:ss";
    format.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
    NSString *datestr = [format stringFromDate:date];
}複製代碼

第二種:字符串包含GMT時區縮寫,dateFormat定義@"yyy-MM-dd HH:mm:ss Z",字符串後面GMT縮寫改成+0000
- (void)timeString {
    NSDate *date = [NSDate date];
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSDateFormatter *format = [NSDateFormatter new];//自定義時間標準
    format.dateFormat = @"yyy-MM-dd HH:mm:ss Z";
    NSUInteger interval = [zone secondsFromGMTForDate:date];//當前時區和UTC時區的秒數差
    NSDate *currentdate = [date dateByAddingTimeInterval:interval];//得到當前時區的date對象
    NSString *datestr = [format stringFromDate:date];
}複製代碼

不推薦第二種,且不說經過yyyy-MM-dd HH:mm:ss Z得到的時間對象每次都有GMT,須要經過修改字符串內的GMT爲+0000的麻煩程度,代碼量增長,並且轉換成功後的NSDate爲0時區的當前時間(這句理解很重要),在咱們經過它的值來計算其它時區的時候會出現錯誤。orm

更推薦第一種,取NSDate時儘可能不要取GMT,代碼量少,減小了沒必要要的NSDate計算,直接使用NSDate轉NSString更準確cdn

NSString時間轉NSDate

字符串時間轉NSDate,等於把時間轉換成0時區UTC
- (void)timedate {
    NSDate *date = [NSDate date];
    NSDateFormatter *format = [NSDateFormatter new];//自定義時間標準
    format.dateFormat = @"yyy-MM-dd HH:mm:ss";
    NSDate *daStr = [format dateFromString:@"2019-07-06 21:21:05"];
}複製代碼

時間比較和計算

比較是否相等
對象

BOOL bl = [date isEqualToDate:date];複製代碼

比較遲早
blog

NSDate *earlier = [date earlierDate:daStr];//比較兩個時間,得到以前的時間
NSDate *later = [date laterDate:daStr];//比較兩個時間,得到以後的時間複製代碼

NSDateFormatter

dateFormat 經常使用

@"yyy-MM-dd HH:mm:ss Z"//GMT格式
@"yyyy-MM-dd"
@"HH:mm:ss"
@"yyyy-MM-dd HH:mm:ss"//hh表示12小時制
@"yyyy-MM-dd HH:mm:ss:sss"//精確到毫秒13位複製代碼

timeZone NSTimeZone

  • name :時區名稱字符串

  • secondsFromGMT:當前時區和UTC的秒數差

  • abbreviation :GMT的縮寫

//用時區名稱、縮寫來定義時區
[NSTimeZone timeZoneWithName:zone.abbreviation];

//用時間差來定義時區
[NSTimeZone timeZoneForSecondsFromGMT:zone.secondsFromGMT];複製代碼

timeStyle

時/分 (12小時格式)
NSDateFormatterShortStyle;

時/分/秒 (12小時格式)
NSDateFormatterMediumStyle;

時/分/秒 (12小時 GMT格式)
NSDateFormatterLongStyle;複製代碼

NSDateComponents

NSDateComponents是經過NSCalendar日曆對象,完成對日期時間的控制

初始化

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];//日曆對象
NSDateComponents *comp = [calendar components:
                              NSCalendarUnitYear |
                              NSCalendarUnitMonth |
                              NSCalendarUnitDay |
                              NSCalendarUnitHour |
                              NSCalendarUnitMinute |
                              NSCalendarUnitSecond |
                              NSCalendarUnitTimeZone |
                              NSCalendarUnitWeekday  fromDate:date];
//	comp.year		年
//	comp.month		月
//	comp.day		日
//	comp.hour		時
//	comp.minute		分
//	comp.second		秒
//	comp.timeZone	時區信息(name/abbreviation/secondsFromGMT)複製代碼

得到星期

NSCalendarUnitWeekday 當前星期幾
NSCalendarUnitWeekOfYear 單位爲年條件下,屬於第幾周
NSCalendarUnitWeekOfMonth 單位爲月條件下,屬於第幾周複製代碼

得到精確日曆單位

- (void)getDayUnit {
    NSDate *date = [NSDate date];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];//日曆類型
    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:date];//較小日曆單位在較大日曆單位內的絕對時間值範圍
}複製代碼

日曆類型 NSCalendarIdentifierChinese 表示中國農曆,NSCalendarIdentifierGregorian 表示公曆

得到計算後日歷單位給定的日期組件添加到給定的日期計算出的絕對日期

- (void)getNewComp {
    NSDate * date = [NSDate date];
    NSDateComponents * comp = [[NSDateComponents alloc] init];
    comp.year = -1;//屬性爲無符號,-表示以前日曆單位,+表示將來日曆單位
    comp.day = 1;
    comp.hour = 2;
    NSCalendar * calendar = [NSCalendar currentCalendar];
    //comp:組件,date:日期,NSCalendarMatchStrictly:向前或向後(日期計算方式)
    NSDate * newData = [calendar dateByAddingComponents:comp toDate:date options:NSCalendarMatchStrictly];
    NSDateFormatter * formatter = [NSDateFormatter new];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSString * time = [formatter stringFromDate:newData];
}複製代碼

NSDateComponents日期組件轉NSDate時間

NSDateComponents * comp = [[NSDateComponents alloc] init];
comp.year = 2019;//組件若是不設置,就默認爲初始值
comp.month = 7;
comp.day = 9;
comp.hour = 13;
comp.minute = 14;
NSCalendar * calendar = [NSCalendar currentCalendar];
NSDate * date = [calendar dateFromComponents:comp];
NSDateFormatter * formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString * str = [formatter stringFromDate:date];複製代碼


最後

技術總結:

1.咱們常常遇到時間戳轉換,不管是時間仍是時間戳,必定要知道這兩個究竟是什麼。

2.在轉換中咱們常常看到UTC和實際時間的時區差,這裏結合時區去理解整個計算方式。

3.format能夠把它看做一個可控的百寶箱,爲你提供各類便捷的操做服務;calendar就是一個管家幫助NSDateComponents完成對日期的控制;而Components裏面則有不少組件用來隨意使用對日期功能的豐富擴展。

4.另外初始化NSDate時間很重要,以上大多數都是[NSDate date]初始化方式,當你看完整篇文章結合本身的理解,也能夠經過傳入某一時間對以上所寫的功能進行封裝靈活運用。

相關文章
相關標籤/搜索