UTC世界標準時間,由原子鐘計算,咱們如今使用的時間標準,UTC表示0時區。bash
GMT格林尼治時間,由英國格林尼治天文臺統一度量,經過它來區分時區。ui
得到時間經過初始化NSDate來獲取咱們須要的時間對象,轉換成string表示spa
得到時間戳經過某一個時間對象到UNIX(1970年1月1日00:00:00 UTC)時間的差值,轉換成string表示code
UTC表示0時區時間是統一的時間標準,當前時間表示帶有GMT修飾的時區時間component
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;
}複製代碼
第一種:字符串不包含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
字符串時間轉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];//比較兩個時間,得到以後的時間複製代碼
@"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位複製代碼
name :時區名稱字符串
secondsFromGMT:當前時區和UTC的秒數差
abbreviation :GMT的縮寫
//用時區名稱、縮寫來定義時區
[NSTimeZone timeZoneWithName:zone.abbreviation];
//用時間差來定義時區
[NSTimeZone timeZoneForSecondsFromGMT:zone.secondsFromGMT];複製代碼
時/分 (12小時格式)
NSDateFormatterShortStyle;
時/分/秒 (12小時格式)
NSDateFormatterMediumStyle;
時/分/秒 (12小時 GMT格式)
NSDateFormatterLongStyle;複製代碼
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 * 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]
初始化方式,當你看完整篇文章結合本身的理解,也能夠經過傳入某一時間對以上所寫的功能進行封裝靈活運用。