NSDate

【NSDate】1、NSDate

时间戳定义:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
举例
2015-07-06 13:28:43 +0000
d->代表天 6 dd->代表天 06
M:月份 (M---->7 MM---->07 MMM---->7月 MMMM ----> 七月)
y、Y:年份 (yy/YY---->15 其他都为 2015)
h:12小时制---->1
hh:12小时制---->01
H:24小时制---->13
HH:24小时制---->13
m/mm s/ss ->分钟和秒都是有0没0的区别
E代表星期几(EEEE-> Friday E/EE/EEE ->Fir)
2、NSDate->NSString()
获取的是格林尼治的时间,0时区,北京为东八区,所以获取的时间比北京时间少了8个小时 +0000代表时区
NSDate *date = [NSDate date]; 打印得到时间 +0000
NSDate *date= [NSDate date]; NSLog(@"当前时间--->%@",date); NSDateFormatter *datef = [[NSDateFormatter alloc]init]; [datef setDateFormat:@"yyyy MMM a HH:mm:ss"]; NSLog(@"格式化时间---->%@", [datef stringFromDate:date]);

输出
当前时间----->2018-06-15 10:06:12 +0000 格式化时间---->2018 Jun PM 18:06:12

两个时间得出的结果相差八个小时
原因:NSDate 系统默认是 0时区的时间;NSString 系统默认是东八区的时间,而我们得到的结果是字符串,所以是东八区的时间
3、NSString->NSDate
NSDate 转化成NSString的时候,只要在NSDateFormatter的设置中写上要转化的格式就能转成字符串,但是NSString转化成NSDate的时候,NSDateFormatter一定要和字符串中的格式对应,否者转化不成功
NSString *string = @"2018年07月01日 15:33:28"; NSDateFormatter *datef1 = [[NSDateFormatter alloc]init]; [datef1 setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"]; NSDate *changeDate = [datef1 dateFromString:string]; NSLog(@"转化的时间 ---->%@",changeDate); log 转化的时间 ---->2018-07-01 07:33:28 +0000

获得的时间是0时区的date,如果想要变成东八区的NSDate,可以手动加上八个小时
NSDate *changedate2 = [changeDate dateByAddingTimeInterval:8 * 60 * 60]; NSLog(@"东八区date: %@",changedate2); 打印 东八区date: 2018-07-01 15:33:28 +0000

4、NSDate 转化成时间戳
NSDate *date= [NSDate date]; NSTimeInterval timeInterval = [date timeIntervalSince1970]; NSLog(@"timeInterval = %.0f",timeInterval); 打印 timeInterval = 1529482408

如果想获取正确东八区的时间戳,转化NSDate需要时0时区的时间,如果获取的是东八区的时间,要想转成时间戳一定要减去8个小时
NSDate -> NSString
1、date是0时区的时间
2、通过设置NSDateFormatter可以设置想要得到的时间格式
3、NSDateFormatter得到的是字符串,字符串默认东八区北京时间
NSString->NSDate
1、NSDateFormatter要严格按照给定的时间字符串的格式进行设置
2、然后得到0时区的NSDate,直接转成时间戳没有问题
3、如果要转成东八区北京时间可以手动添加8小时
!!!!注意!!!!
NSDate默认0时区
NSString默认东八区
转时间戳用0时区NSDate
例外:就是通过datePicker,获取的应该是NSDate类型的对象,是北京当前的时间(东八区)
参考链接传送门

    推荐阅读