NSTimeZone时区

1.项目中设计到海外用户,所以时间的显示就必须考虑到时区的问题了

首先保证项目中的时间是正确的,[NSDate date]获取的是设备的时间,不准确,设备的时间可以修改的,做法是通过接口获取服务器的北京的时间,保存在本地,然后本地开启定时器更新时间。

接下来是时间的展示,把北京的时间转化成本地时间,步骤为先转为UTC时间,然后在转成本地时间

北京时间转化成UTC时间,需要指定NSDateFormatter的时区,时区为你需要转化时间的时区,如果不设置是会采用设备默认的时区,

NSDateFormatter *beijingFormatter = [[NSDateFormatter alloc] init];
[beijingFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSTimeZone *beijingZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
[beijingFormatter setTimeZone:beijingZone];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

//  北京时间
NSString *beijingTime = @"2018-05-08 12:00:00";

//北京时间转NSDate    转NSDate时,如果涉及到时区问题,必须指定 Formatter 中的时区
NSDate *beijingDate = [beijingFormatter dateFromString:beijingTime];

NSDate *beijingDate2 = [dateFormatter dateFromString:beijingTime];

beijingFormatter 设置的上海时区,dateFormatter没有设置时区,让我们运行看下结果:

设备时区设置成北京,运行结果


屏幕快照 2018-05-16 下午11.15.10.png

可以看到UTC时间应该是北京时间-8个小时,结果都对
NSDate获取到的时间永远都是UTC时间

设备时区设置成美国,运行结果

屏幕快照 2018-05-16 下午11.16.39.png

运行的结果为,bejingDate2 在原来要转化的时间上 +4,美国时区是GTM-4,所以没有指定时区时,默认设备的时区。

转UTC时间时,需要指定时区,时区为要转化时间的时区
  1. NSTimeZone创建
//  根据缩写获取
NSTimeZone *abbTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"HKT"];
//  根据时区名字
NSTimeZone *shanghaiZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];

// 返回 GMT零时区偏移 28800 的新的时区
NSTimeZone *secondsTimeZone = [NSTimeZone timeZoneForSecondsFromGMT:28800];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概念解释 时区(Timezone) 为什么会将地球分为不同时区呢?因为地球总是自西向东自转,东边总比西边先看到太阳...
    黑炭妈阅读 7,152评论 0 5
  • 前言 1、NSTimeZone 时区的创建 2、NSTimeZone 时区的设置 3、NSTimeZone 时区的...
    Yumazhiyao阅读 13,893评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,273评论 19 139
  • 绿影覆幽池,芳菲四月时。 管弦朝夕兴,组绣百千枝。 盛引墙看遍,高烦架屡移。 露轻濡彩笔,蜂误拂吟髭。
    f6a3d3dce0ee阅读 209评论 0 0