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]
初始化方式,当你看完整篇文章结合本身的理解,也能够经过传入某一时间对以上所写的功能进行封装灵活运用。