最近做的项目要海外用,与设备交互,比如定时延时任务什么的,就不能只按照国内的时区来了,不然国外用着就炸了。
先摆上我最开始获取时区的方式:(突然感觉很chun --!)
-(NSString *)getTimezone
{
NSTimeZone *localZone = [NSTimeZone localTimeZone];
NSString *strZoneAbbreviation = [localZone abbreviation];
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:@"[a-zA-Z]" options:0 error:nil];
strZoneAbbreviation = [regularExpression stringByReplacingMatchesInString:strZoneAbbreviation options:0 range:NSMakeRange(0, strZoneAbbreviation.length) withTemplate:@""];
return strZoneAbbreviation;
}
上面的代码你会获取到这样的字符串 : +8 这种什么的。就是与0时区的差值,我这里是用正则的方式去掉了字母。
后来国外的客户用着一直有问题,然后我这边自己修改了手机时区测试了下,这种方式确实是有问题了。
打印一下所有已知的时区看看。
NSArray *array=[NSTimeZone knownTimeZoneNames];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSTimeZone *t=[[NSTimeZone alloc]initWithName:obj];
NSLog(@"- %@",t.abbreviation);
}];
你会发现如下的东西。
第一张图这种,去掉字母就没了。=-=
第二张图,如果直接把得到的字符串转整形也会有锅。
所以呢,还是用最标准的方式比较靠谱了。
获取当前时区与0时区的间隔秒数
NSTimeZone *localZone = [NSTimeZone localTimeZone];
NSInteger seconds= [localZone secondsFromGMT];
这就避免了上面的两个问题了。