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没有设置时区,让我们运行看下结果:
设备时区设置成北京,运行结果
可以看到UTC时间应该是北京时间-8个小时,结果都对
NSDate获取到的时间永远都是UTC时间
设备时区设置成美国,运行结果
运行的结果为,bejingDate2 在原来要转化的时间上 +4,美国时区是GTM-4,所以没有指定时区时,默认设备的时区。
转UTC时间时,需要指定时区,时区为要转化时间的时区
- NSTimeZone创建
// 根据缩写获取
NSTimeZone *abbTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"HKT"];
// 根据时区名字
NSTimeZone *shanghaiZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
// 返回 GMT零时区偏移 28800 的新的时区
NSTimeZone *secondsTimeZone = [NSTimeZone timeZoneForSecondsFromGMT:28800];