NSTimeZone

**时区是一个地理名字,是为了克服各个地区或国家之间在使用时间上的混乱。

基本概念:

  1. GMT 0:00 格林威治标准时间; UTC +00:00 校准的全球时间; CCD +08:00 中国标准时间 [来自百度百科]
  2. 夏时制,英文"DaylightSavingTime"。夏季时将时区内的时间提前(一般为1小时),以节省资源,提高效率。使用夏时制期间,当前时区相对于GMT的时间偏移量会发生变化。在某些应用中可能需要考虑。
  3. 任何时区都以GMT为基准,即,任何NSTimeZone对象所代表的时区都是相对于GMT的,这里的相对性是NSTimeZone中最重要的属性,我们称之为当前时区相对于GMT的偏移量。一旦知道了一个偏移量,便可以确定一个时区。在iOS中,偏移量是以"秒"为单位的。
  4. NSTimeZone是一个类簇,我们所使用的任何NSTimeZone对象都是NSTimeZone的私有子类。
  5. iOS中的时间类NSDate中存储的时间,都是相对于GMT的,我们使用NSDate时,会根据App的时区设置返回与时区对应的数据。
  6. iOS系统中的/usr/share/zoneinfo/目录中保存了所有的可根据 地理位置名称 或 时区别名 得到的时区信息。时区别名都是与具体的地理位置一一对应的。(已越狱的童鞋请看)
  7. iOS中的时区表示方法:GMT+0800 GMT-0800。(+:东区 -:西区 08:小时数 00:分钟数)。 GMT+0830就是指比GMT早8小时外加30分钟的时区。

由方法理解NSTimeZone

  1. 第一批

    1. // 这个方法的名字很委婉,known一词说明这是“他”已知的时区的名字。世界各地对自己所在的时区可能都有一定的命名,但是不一定被“他”收录。例如,中国大陆,只有重庆和上海被收录了(难道这是中国只使用一个时区的错误?!)。使用这个方法获得的时区名字,都是在iOS系统中/usr/share/zoneinfo/目录中保存时区数据。随着iOS版本的更新,这里面的数据会发生变动。当然,要是你的设备越狱了,你可以手动往该目录下添加时区文件。
    2. // 时区文件里面包括了一下内容:
    3. // 当前时区相对于GMT的偏移量(s)
    4. // 当前时区的名字缩写
    5. // 当前时区是否使“夏时制”时区
    6. // 因为时区文件中包含了"偏移量",所以通过“时区的名称”可以指定一个“时区”。
    7. // 时区名称举例:
    8. // Africa/Abidjan
    9. // America/New_York
    10. // Asia/Shanghai
    11. // Asia/Hong_Kong
    12. // 越狱的童鞋可以看出时区的名称和/usr/share/zoneinfo中的目录结构基本一一对应。
    13. +(NSArray*)knownTimeZoneNames;
    14. // 获取所有的时区名称缩写
    15. // 名称缩写与名称是一一对应的关系,例如:HKT = "Asia/Hong_Kong";
    16. // 默认情况下,调用该方法回去/usr/share/zoneinfo目录下找时区名称缩写,但是当使用方法"+ (void)setAbbreviationDictionary:(NSDictionary *)dict;"后,将会只返回刚才设置的时区名称缩写。请看下文的代码实例!
    17. // 名称缩写举例:
    18. // EST = "America/New_York";
    19. // GMT = GMT;
    20. // GST = "Asia/Dubai";
    21. // HKT = "Asia/Hong_Kong";
    22. +(NSDictionary*)abbreviationDictionary;
  2. 第二批

    1. // 由时区的名称获得对应的NSTimeZone对象
    2. // 通过时区名称可以获得时区文件,通过时区文件就可以获得“偏移量”,“名称缩写”,“是否使用夏时制”等信息。
    3. +(id)timeZoneWithName:(NSString*)tzName;
    4. // 由时区名称缩写获得对应的NSTimeZone对象
    5. // 这里的时区名称缩写有两种情况:
    6. // 第一种是上面说的HKT这样的缩写,与时区名称一一对应,通过这样的缩写获得的NSTimeZone对象,与使用时区名称获得得NSTimeZone对象一样。(大概读取得是同一个时区文件)
    7. // 第二种是"GMT+0800"这样格式得缩写,其实这就是偏移量。通过偏移量在iOS中是不能读到与之对应得时区文件的,因此就无法知道“时区名称”,“名称缩写”,“是否使用夏时制”这样的信息了。默认情况下,"时区名称"和"名称缩写"都会赋值为"GMT+0800","是否使用夏时制"则不会设置(默认不使用)。
    8. +(id)timeZoneWithAbbreviation:(NSString*)abbreviation;
    9. // 由偏移量获得对应的NSTimeZone对象
    10. // 只说一点:通过偏移量获得的NSTimeZone对象的“市区名称”,“名称缩写”都会赋值为"GMT+0800","是否使用夏时制"则不会设置(默认不使用)。
    11. // 注意!!!!该方法不做参数的范围检查!!!
    12. +(id)timeZoneForSecondsFromGMT:(NSInteger)seconds;// 不做安全性检查

NSTimeZone的属性变量(猜想):

  1. // 当前时区与GMT的偏移量,以秒为单位 可通过方法"- (NSInteger)secondsFromGMT;"获取,中国标准时区的偏移量为(8*60*60)。
  2. // 这是NSTimeZone类中最基本的属性,类似于NSDate中的_secondsSinceRef属性。
  3. // 其他的属性都是为了丰富NSTimeZone,以实现offset与具体的地理位置以及与时区相关的其他信息的绑定。
  4. // 对应方法:- (NSInteger)secondsFromGMT;
  5. int offset;
  6. // 时区的名称,
  7. // 对应方法:- (NSString *)name;
  8. NSString*_name;
  9. // 时区名称缩写
  10. // 对应方法:- (NSString *)abbreviation;
  11. NSString*abbrev;
  12. // 时区文件数据
  13. // 对应方法:- (NSData *)data;
  14. NSData*_data;
  15. // 时区是否使用夏时制
  16. // 对应方法:- (BOOL)isDaylightSavingTime;
  17. BOOL is_dst;

代码实例:

时区对时间的影响

  1. // 修改默认时区会影响时间的输出显示
  2. [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT+0900"]];// 只能够修改该程序的defaultTimeZone,不能修改系统的,更不能修改其他程序的。
  3. NSDateFormatter*dateFormatter =[[NSDateFormatter alloc] init];
  4. [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  5. NSDate*now =[NSDate date];
  6. NSLog(@"now:%@",[dateFormatter stringFromDate:now]);
  7. // 也可直接修改NSDateFormatter的timeZone变量
  8. dateFormatter.timeZone =[NSTimeZone timeZoneWithAbbreviation:@"GMT+0800"];
  9. NSLog(@"now:%@",[dateFormatter stringFromDate:now]);

添加中国标准时间名称缩写

  1. // 设置并获取时区的缩写
  2. NSMutableDictionary*abbs =[[NSMutableDictionary alloc] init];
  3. [abbs setValuesForKeysWithDictionary:[NSTimeZone abbreviationDictionary]];
  4. [abbs setValue:@"Asia/Shanghai" forKey:@"CCD"];
  5. [NSTimeZone setAbbreviationDictionary:abbs];
  6. NSLog(@"abbs:%@",[NSTimeZone abbreviationDictionary]);

夏天了!注意夏时制!

  1. // 因为“夏时制”而产生的方法
  2. -(NSInteger)secondsFromGMTForDate:(NSDate*)aDate;
  3. -(NSString*)abbreviationForDate:(NSDate*)aDate;
  4. -(BOOL)isDaylightSavingTimeForDate:(NSDate*)aDate;
  5. -(NSTimeInterval)daylightSavingTimeOffsetForDate:(NSDate*)aDate NS_AVAILABLE(10_5,2_0);
  6. -(NSDate*)nextDaylightSavingTimeTransitionAfterDate:(NSDate*)aDate NS_AVAILABLE(10_5,2_0);

本文转自:http://my.oschina.net/yongbin45/blog/151376

最新文章

  1. linux svn 搭建
  2. linux 项目环境搭建配置
  3. Hover.css:一组超实用的 CSS3 悬停效果和动画
  4. oracle DB_LINK
  5. js通过sessionStorage实现的返回上一页
  6. ThinkPHP 3.2.3 视图模型的使用
  7. attention 机制
  8. 跨平台的加密算法XXTEA 的封装
  9. 转:Unicode字符集和多字节字符集关系
  10. Java基础知识强化之IO流笔记35:InputStreamReader(Reader字符流的子类)2种read数据方式
  11. Express使用html模板
  12. mac下升级ruby环境版本
  13. windows API与C#的数据类型对应关系表
  14. Hmaster启动后自己挂掉
  15. Pivot-Header的花式效果
  16. 【分享】2017 开源中国新增开源项目排行榜 TOP 100
  17. zookeeper集群的搭建(个人实践可行)
  18. Redis:MySQL算老几?
  19. Python2.*与Python3.*共存问题
  20. NOIP2012题解

热门文章

  1. python decorator simple example
  2. paip.windows io监控总结
  3. java继承3个小题
  4. bzoj 4300: 绝世好题
  5. 虚拟机评估——如何确定一个CPU核上部署的虚拟机数量?
  6. SSD在SQLServer中的应用
  7. SQL Developer 4.0 启动报错“unable to create an instance of the java virtual machine located at path”
  8. Distributed Result Grouping Caveats
  9. mac 命令行 安装 需要管理员 权限
  10. Markdown学习语法的记录