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类型的对象,是北京当前的时间(东八区)

参考链接传送门

你可能感兴趣的:(NSDate)