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. 第一批spa

    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. 第二批.net

    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/151376code

相關文章
相關標籤/搜索