zoukankan      html  css  js  c++  java
  • iOS时间那点事儿–NSTimeZone

    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.  
    6. NSDate*now =[NSDate date];
    7. NSLog(@"now:%@",[dateFormatter stringFromDate:now]);
    8.  
    9. // 也可直接修改NSDateFormatter的timeZone变量
    10. dateFormatter.timeZone =[NSTimeZone timeZoneWithAbbreviation:@"GMT+0800"];
    11. 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

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/yingkong1987/p/3445309.html
Copyright © 2011-2022 走看看