iOS時間那點事--NSTimeZone

#iOS時間那點事安全

##NSTimeZone.net

**時區是一個地理名字,是爲了克服各個地區或國家之間在使用時間上的混亂。code

###基本概念:orm

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

    // 這個方法的名字很委婉,known一詞說明這是「他」已知的時區的名字。世界各地對本身所在的時區可能都有必定的命名,可是不必定被「他」收錄。例如,中國大陸,只有重慶和上海被收錄了(難道這是中國只使用一個時區的錯誤?!)。使用這個方法得到的時區名字,都是在iOS系統中/usr/share/zoneinfo/目錄中保存時區數據。隨着iOS版本的更新,這裏面的數據會發生變更。固然,要是你的設備越獄了,你能夠手動往該目錄下添加時區文件。		
     // 時區文件裏面包括了一下內容:
     //		當前時區相對於GMT的偏移量(s)
     //		當前時區的名字縮寫
     //		當前時區是否使「夏時制」時區
     // 由於時區文件中包含了"偏移量",因此經過「時區的名稱」能夠指定一個「時區」。
     // 時區名稱舉例:
     //		Africa/Abidjan
     //		America/New_York
     //		Asia/Shanghai
     //		Asia/Hong_Kong
     // 越獄的童鞋能夠看出時區的名稱和/usr/share/zoneinfo中的目錄結構基本一一對應。
     + (NSArray *)knownTimeZoneNames;
    
    
     // 獲取全部的時區名稱縮寫
     // 名稱縮寫與名稱是一一對應的關係,例如:HKT = "Asia/Hong_Kong";
     // 默認狀況下,調用該方法回去/usr/share/zoneinfo目錄下找時區名稱縮寫,可是當使用方法"+ (void)setAbbreviationDictionary:(NSDictionary *)dict;"後,將會只返回剛纔設置的時區名稱縮寫。請看下文的代碼實例!
     // 名稱縮寫舉例:
     //		EST = "America/New_York";
     //		GMT = GMT;
     //		GST = "Asia/Dubai";
     //		HKT = "Asia/Hong_Kong";
     + (NSDictionary *)abbreviationDictionary;
  2. 第二批資源

    //	由時區的名稱得到對應的NSTimeZone對象
     //  經過時區名稱能夠得到時區文件,經過時區文件就能夠得到「偏移量」,「名稱縮寫」,「是否使用夏時制」等信息。
     + (id)timeZoneWithName:(NSString *)tzName;
    
     //	由時區名稱縮寫得到對應的NSTimeZone對象
     //	這裏的時區名稱縮寫有兩種狀況:
     //	第一種是上面說的HKT這樣的縮寫,與時區名稱一一對應,經過這樣的縮寫得到的NSTimeZone對象,與使用時區名稱得到得NSTimeZone對象同樣。(大概讀取得是同一個時區文件)
     //	第二種是"GMT+0800"這樣格式得縮寫,其實這就是偏移量。經過偏移量在iOS中是不能讀到與之對應得時區文件的,所以就沒法知道「時區名稱」,「名稱縮寫」,「是否使用夏時制」這樣的信息了。默認狀況下,"時區名稱"和"名稱縮寫"都會賦值爲"GMT+0800","是否使用夏時制"則不會設置(默認不使用)。
     + (id)timeZoneWithAbbreviation:(NSString *)abbreviation;
    
     //	由偏移量得到對應的NSTimeZone對象
     //	只說一點:經過偏移量得到的NSTimeZone對象的「市區名稱」,「名稱縮寫」都會賦值爲"GMT+0800","是否使用夏時制"則不會設置(默認不使用)。
     //  注意!!!!該方法不作參數的範圍檢查!!!
     + (id)timeZoneForSecondsFromGMT:(NSInteger)seconds;       // 不作安全性檢查

###NSTimeZone的屬性變量(猜測):get

// 當前時區與GMT的偏移量,以秒爲單位  可經過方法"- (NSInteger)secondsFromGMT;"獲取,中國標準時區的偏移量爲(8*60*60)。
// 這是NSTimeZone類中最基本的屬性,相似於NSDate中的_secondsSinceRef屬性。
// 其餘的屬性都是爲了豐富NSTimeZone,以實現offset與具體的地理位置以及與時區相關的其餘信息的綁定。
//	對應方法:- (NSInteger)secondsFromGMT;
int offset;

// 時區的名稱,
// 對應方法:- (NSString *)name;
NSString *_name;

// 時區名稱縮寫
// 對應方法:- (NSString *)abbreviation;
NSString *abbrev;

// 時區文件數據
// 對應方法:- (NSData *)data;
NSData *_data;

// 時區是否使用夏時制
// 對應方法:- (BOOL)isDaylightSavingTime;
BOOL is_dst;

##代碼實例:string

###時區對時間的影響it

<!-- lang: cpp -->
// 修改默認時區會影響時間的輸出顯示
 [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT+0900"]]; // 只可以修改該程序的defaultTimeZone,不能修改系統的,更不能修改其餘程序的。
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *now = [NSDate date];
NSLog(@"now:%@", [dateFormatter stringFromDate:now]);

// 也可直接修改NSDateFormatter的timeZone變量
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT+0800"];
NSLog(@"now:%@", [dateFormatter stringFromDate:now]);

###添加中國標準時間名稱縮寫

<!-- lang: cpp -->
// 設置並獲取時區的縮寫
NSMutableDictionary *abbs = [[NSMutableDictionary alloc] init];
[abbs setValuesForKeysWithDictionary:[NSTimeZone abbreviationDictionary]];
[abbs setValue:@"Asia/Shanghai" forKey:@"CCD"];
[NSTimeZone setAbbreviationDictionary:abbs];
NSLog(@"abbs:%@", [NSTimeZone abbreviationDictionary]);

###夏天了!注意夏時制!

<!-- lang: cpp -->
// 由於「夏時制」而產生的方法
- (NSInteger)secondsFromGMTForDate:(NSDate *)aDate;
- (NSString *)abbreviationForDate:(NSDate *)aDate;
- (BOOL)isDaylightSavingTimeForDate:(NSDate *)aDate;
- (NSTimeInterval)daylightSavingTimeOffsetForDate:(NSDate *)aDate NS_AVAILABLE(10_5, 2_0);
- (NSDate *)nextDaylightSavingTimeTransitionAfterDate:(NSDate *)aDate NS_AVAILABLE(10_5, 2_0);

###本系列其餘文章不斷更新中:

  1. iOS時間那點事--NSDate
  2. iOS時間那點事--NSDateFormatter
  3. iOS時間那點事--NSTimeZone
  4. iOS時間那點事--NSLocale
相關文章
相關標籤/搜索