iOS 时间戳 时区

时间戳

时间戳(Unix)是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。也就是说它表示的时间是唯一的

可以通过时间戳在线转换 看一看它的样子。

iOS 时间戳 时区_第1张图片
时间戳在线转换

时区

时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。
在中国采用首都北京所在地东八区的时间为全国统一使用时间。
正是由于时区的存在才导致当前时间显示不一样

iOS 时间戳 时区_第2张图片
北京东八区
iOS 时间戳 时区_第3张图片
旧金山西八区

可以看到 北京 和 旧金山 分别处于两个不同的时区,导致当前显示的时间也不一样。

不同时区间的时间切换

在很多app中都会有这个需求,根据服务器返回的时间与当前的时间作比较。比如服务器返回一个时间字符串,就以上面的截图为例吧,返回 2017-06-15 19:40:00 西八区的时间,获取当前用户所在区的时间。
现在处理下:

- (void)touchesBegan:(NSSet *)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 处理方法呢和上面类似,就不啰嗦了。

你可能感兴趣的:(iOS 时间戳 时区)