#iOS時間那點事安全
##NSTimeZone.net
**時區是一個地理名字,是爲了克服各個地區或國家之間在使用時間上的混亂。code
###基本概念:orm
###由方法理解NSTimeZone對象
第一批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;
第二批資源
// 由時區的名稱得到對應的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);
###本系列其餘文章不斷更新中: