时间戳
时间戳(Unix)是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。也就是说它表示的时间是唯一的。
可以通过时间戳在线转换 看一看它的样子。
时区
时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。
在中国采用首都北京所在地东八区的时间为全国统一使用时间。
正是由于时区的存在才导致当前时间显示不一样
可以看到 北京 和 旧金山 分别处于两个不同的时区,导致当前显示的时间也不一样。
不同时区间的时间切换
在很多app中都会有这个需求,根据服务器返回的时间与当前的时间作比较。比如服务器返回一个时间字符串,就以上面的截图为例吧,返回 2017-06-15 19:40:00 西八区的时间,获取当前用户所在区的时间。
现在处理下:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//服务器获取的时间是 西八区的 2017-06-15 19:40:00
NSString *serverTimeStr = @"2017-06-15 19:40:00";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"US/Pacific"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [dateFormatter dateFromString:serverTimeStr];
//当前时区的时间 这里是 东八区
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
NSString *time = [dateFormatter stringFromDate:date];
NSLog(@"服务器 时间 %@", serverTimeStr);
NSLog(@"用户所在时区 时间 %@", time);
}
可以对比下上面两张图片 是正确的 至于为啥一个39秒 一个40面纯属截图手速问题。
将手机时区调成 休斯顿
输出结果表明 用户所在时区休斯顿比服务器返回的 旧金山 快两个小时,而休斯顿是位于西六区的, 所以结果西六区比西八区慢两小时也是正确的。
地理没学好,不会算的可以看这张图。
不常见的时间表示
**2017-06-08T11:29:29.209Z **
这里面实际上已经包含了时区的信息。对应的时间格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ 处理方法呢和上面类似,就不啰嗦了。