三句话理解时区与时间戳

作者: CoderHG | 来源:发表于2017-06-13 23:36 被阅读851次

    从不浪费时间的人,没有工夫抱怨时间不够。 —— 杰弗逊

    第一句话:时间戳

    时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字,叫时间戳时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。

    关于 时间戳, 你可以看在线时间戳

    第二句话:时区

    时间戳 在地球的每一个角落都是相同的,但是在相同的时间点会有不同的表达方式,所以有了另外一个时间概念,叫时区。这里的时区地区不是同一个概念,例如我们所在的时区东八区
    在设备中,可以自己手动的切换当前的系统时区:

    时区设置

    你会发现:当你选在不同的时区,你的当前时间是不一样的。

    第三句话:时间戳与时区在Code中应用

    一、时间戳 是不会跟着 时区 的改变而改变

    可以用代码来证明这一点:

    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        
        // 系统时区
        NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
        NSLog(@"系统当前的时区: %@",  timeZone.name);
        
        // 返回的单位是 秒
        NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970] ;
        
        NSLog(@"当前时间戳:%f", timeInterval);
    }
    

    你会发现,不管怎么切换时区时间戳总是一致。可以实时的参照在线时间戳进行验证。

    二、不同 时区 间的时间切换

    这个需求并不是空穴来风,在很多的app中都会用到的。比如根据服务器返回的时间与当前时间进行一个比较,这里就会有多种可能性,主要体现在服务器返回时间的方式,比如直接返回一个固定时间的字符串,比如:2017-06-14 22:55:23。然后接口的同事告诉你这个是 东八区 时间。让你自己转成当前 时区 的时间。

    1、将当前 时区 的时间转成不同 时区 的时间

    不管当前设备的 时区 在什么地方,都将其转成 东八区 的时间格式。代码如下:

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        // 系统时区,默认就是当前的时区
        NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
        NSLog(@"系统当前的时区: %@",  timeZone.name);
        
        // 获取当前时间
        NSDate* date = [NSDate date];
        
        // 时间格式
        NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        
        NSString* now = [dateFormatter stringFromDate:date];
        
        NSLog(@"系统当前时间显示: %@", now);
        
        // 将时区设置成 东八区
        [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8*3600]];
        // 设置后的时间显示
        now = [dateFormatter stringFromDate:date];
        
        NSLog(@"东八区的当前时间显示: %@", now);
    }
    

    打印结果如下:

    打印完美结果
    2、2017-06-08T11:29:29.209Z

    当有一天你发现服务器返回这样的时间,请不要束手无策,因为这个时间格式就已经明确的将时区也告诉你了,你只需要这样做,就能随时随地的转成当前时区的时间格式:

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        // 时间字符串 (带有时区信息)
        NSString* timeTEXT = @"2017-06-08T11:29:29.209Z";
        // 对应时间格式
        NSString* formateTEXT =  @"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:formateTEXT];
        
        // 获取当前对应时区的时间
        NSDate* curDate = [dateFormatter dateFromString:timeTEXT];
        
        NSLog(@"对应当前时区的时间: %@", curDate);
    }
    
    

    上面的代码,没有看到有 时区 间的切换,但是是正确的。因为timeTEXT已经自带时区 信息。然而 NSDateFormatter 对象默认是当前设备的 时区。所以 curDate 就是当前设备的时间。

    3、想了一下,没有其它的需要补充了,都太简单。
    谢谢~

    相关文章

      网友评论

        本文标题:三句话理解时区与时间戳

        本文链接:https://www.haomeiwen.com/subject/uimjqxtx.html