iOS获取时区详解
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/16160003.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
systemTimeZone
系统当前使用的时区。如果无法确定当前时区,则返回 GMT 时区。
这是设备认为它所在的时区;它通常是自动设置的,然后会对应于设备的物理位置,但如果用户在设置应用程序中明确设置了特定的时区,这就是你会得到的。
defaultTimeZone
当前应用程序的默认时区。如果没有设置默认时区,该方法调用systemTimeZone
并返回系统时区。
您的应用程序可以设置自己的时区,以便您可以像设备在另一个时区一样执行操作,但不会影响系统时区(以及其他应用程序)。通过调用 来执行设置setDefaultTimeZone:
。如果您还没有这样做,则此调用与调用相同systemTimeZone
。
localTimeZone
将所有消息转发到当前应用程序的默认时区的对象。本地时区始终代表默认时区的当前状态。
这是它变得有点棘手的地方。localTimeZone
给你几乎相同的结果defaultTimeZone
。NSTimeZone
不同之处在于,您从中获取的特定实例localTimeZone
将始终反映您对应用程序中的时区所做的设置。您可以调用它一次,保存结果,并始终通过该对象获取当前模拟时区,无论所做的更改如何。就好像,当您使用此NSTimeZone
实例时,框架正在召唤defaultTimeZone
您,以确保您始终获得当前值。
这是上面的几个简要说明。您返回的NSTimeZone
对象systemTimeZone
代表您拨打电话时的系统时区。如果您systemTimeZone
再次调用,即使用户已经更改了时区,您也会得到相同的时区。您的应用程序会缓存该值,您必须要求系统清除它resetSystemTimeZone
才能获取更新。
// Say that device is in GMT originally NSLog(@"%@", [NSTimeZone systemTimeZone]); // GMT // User flies into Rome and iPhone changes the zone automatically NSLog(@"%@", [NSTimeZone systemTimeZone]); // Still GMT [NSTimeZone resetSystemTimeZone]; // Clear app's cache NSLog(@"%@", [NSTimeZone systemTimeZone]); // Now GMT+2
类似的事情发生在defaultTimeZone
. 当您调用该方法时,您将获得一个始终表示同一时区的对象,即使您稍后调用setDefaultTimeZone:
. 但是,如果您使用从中获取的对象localTimeZone
,它将遵循您对默认时区所做的更改*。
// Say that defaultTimeZone is originally GMT NSTimeZone * myDefaultTZ = [NSTimeZone defaultTimeZone]; NSTimeZone * myLocalTZ = [NSTimeZone localTimeZone]; [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Etc/GMT-4"]]; NSLog(@"%@", myDefaultTZ); // Still gives GMT NSLog(@"%@", [NSTimeZone defaultTimeZone]); // GMT-4, the new value NSLog(@"%@", myLocalTZ); // Also the new value!
苹果似乎建议使用 localTimeZone
:
使用 localTimeZone 类方法,您可以获得一个相对时区对象,该对象将自身解码为它所在的任何计算机上的默认时区。
*注意,
localTimeZone
仍以系统时区的应用级缓存为准。它只会根据您对默认时区的设置进行更改。
获取时区的方法解析
方法一(存在问题)
[NSTimeZone resetSystemTimeZone]; NSTimeZone *timeZone = [NSTimeZone systemTimeZone]; NSLog(@"timeZoneString = %@",timeZone.abbreviation);
在本地测试没有问题,比如手机时间是东八区的时间,那么就打印出GMT+8
,设置成其他地区的时间也正常。但当时区设置为0
时,打印出来的是GMT
,而不是GMT+0
,从这个角度看,这种方法似乎也不妥,还需要自己转换。
此外,经过大量的测试,这种方法在个别手机上获取到的时间格式不是GMT
的格式。比如香港的个别手机获取到的时区是HKT
,表示的是香港时间。同样每个地区都有当地时区的简称(参考:世界时区)。
其实看看文档就会发现这种方法不适合目前的需求。
The abbreviation for the receiver, such as “EDT” (Eastern Daylight Time).
方法二
NSDate *date = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"z"; NSLog(@"timeZoneString = %@",[dateFormatter stringFromDate:date]);
这里小写的z
表示的是时区
的意思。同样也可是试试看看大写的Z
。这种方法没有做大量的测试。当时区设置为0
时,同样打印出来的是 GMT
。这种方法也有可能会出现方法一的问题。
方法三
[NSTimeZone resetSystemTimeZone]; NSInteger offset = [NSTimeZone systemTimeZone].secondsFromGMT; offset = offset / 3600; NSString *timeZoneString = nil; if (offset < 0) { timeZoneString = [NSString stringWithFormat:@"GMT%ld", offset]; } else { timeZoneString = [NSString stringWithFormat:@"GMT+%ld", offset]; } NSLog(@"timeZoneString = %@",timeZoneString);
相关方法解析通过时间偏差来计算时区。
- (NSInteger)secondsFromGMT;
获取到当前时区和0时区的间隔秒数。
+ (NSTimeZone *)systemTimeZone; + (NSTimeZone *)localTimeZone; + (NSTimeZone *)defaultTimeZone;
区别
1、systemTimeZone 获取系统的时区,不可设置。当前应用程序的默认时区。如果没有设置默认时区,该方法调用systemTimeZone
并返回系统时区。
2、defaultTimeZone 获取当前APP的时区,可以自己设置。当前应用程序的默认时区。如果没有设置默认时区,该方法调用systemTimeZone
并返回系统时区。
3、localTimeZone 将所有消息转发到当前应用程序的默认时区的对象。本地时区始终代表默认时区的当前状态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2019-04-07 [Swift]LeetCode1024. 视频拼接 | Video Stitching
2019-04-07 [Swift]LeetCode1023. 驼峰式匹配 | Camelcase Matching
2019-04-07 [Swift]LeetCode1022. 从根到叶的二进制数之和 | Sum of Root To Leaf Binary Numbers
2019-04-07 [Swift]LeetCode1021. 删除最外层的括号 | Remove Outermost Parentheses