iOS NSDate中關(guān)于夏令時(shí)的坑
前言
最近線上推廣項(xiàng)目的時(shí)候,運(yùn)營(yíng)反饋了幾個(gè)bug,其中一個(gè)就是字符串轉(zhuǎn)NSDate對(duì)象出現(xiàn)nil的情況。
舉個(gè)例子:
NSString *timeStr = @"1992-04-05"; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd"]; NSDate * date1 = [formatter dateFromString:timeStr]; NSLog(@"timeStr to date is %@ %@", timeStr, date1);
這里的timeStr就是用戶的生日,平時(shí)測(cè)試的時(shí)候,這塊代碼都是ok的。那么如果我們把生日換成1986-05-04,此時(shí)的date就會(huì)轉(zhuǎn)化失敗,為null。
經(jīng)查找資料,發(fā)現(xiàn)這個(gè)情況是由于夏令時(shí)引起的。
夏時(shí)令(Daylight Saving Time:DST),又稱“日光節(jié)約時(shí)制”和“夏令時(shí)間”,是一種為節(jié)約能源而人為規(guī)定地方時(shí)間的制度,在這一制度實(shí)行期間所采用的統(tǒng)一時(shí)間稱為“夏令時(shí)間”。一般在天亮早的夏季人為將時(shí)間調(diào)快一小時(shí),可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個(gè)采納夏時(shí)制的國(guó)家具體規(guī)定不同。目前全世界有近110個(gè)國(guó)家每年要實(shí)行夏令時(shí)。
1986年4月,中國(guó)中央有關(guān)部門(mén)發(fā)出“在全國(guó)范圍內(nèi)實(shí)行夏時(shí)制的通知”,具體作法是:每年從四月中旬第一個(gè)星期日的凌晨2時(shí)整(北京時(shí)間),將時(shí)鐘撥快一小時(shí),即將表針由2時(shí)撥至3時(shí),夏令時(shí)開(kāi)始;到九月中旬第一個(gè)星期日的凌晨2時(shí)整(北京夏令時(shí)),再將時(shí)鐘撥回一小時(shí),即將表針由2時(shí)撥至1時(shí),夏令時(shí)結(jié)束。從1986年到1991年的六個(gè)年度,除1986年因是實(shí)行夏時(shí)制的第一年,從5月4日開(kāi)始到9月14日結(jié)束外,其它年份均按規(guī)定的時(shí)段施行。在夏令時(shí)開(kāi)始和結(jié)束前幾天,新聞媒體均刊登有關(guān)部門(mén)的通告。1992年起,夏令時(shí)暫停實(shí)行。
- 1986年4月13日至9月14日
- 1987年4月12日至9月13日
- 1988年4月10日至9月11日
- 1989年4月16日至9月17日
- 1990年4月15日至9月16日
- 1991年4月14日至9月15日
以上時(shí)間段都屬于夏令時(shí),但是經(jīng)過(guò)多次測(cè)試,這其中有的日子是可以轉(zhuǎn)化為NSDate的,目前只發(fā)現(xiàn)了6個(gè)日期會(huì)有問(wèn)題。1991-04-14, 1986-05-04, 1987-04-12, 1989-04-16, 1990-04-15,1988-04-10(ps:沒(méi)有做覆蓋測(cè)試,可能還有更多)
解決方案:
一、使用GMT零時(shí)區(qū)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];// 零時(shí)區(qū) [formatter setDateFormat:@"yyyy-MM-dd"];
二、設(shè)置lenient屬性
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.lenient = YES; // 這個(gè)屬性沒(méi)有官方的解釋,個(gè)人理解為:如果當(dāng)前時(shí)間不存在的話,會(huì)默認(rèn)獲取距離最近的整點(diǎn)時(shí)間 [formatter setDateFormat:@"yyyy-MM-dd"];
iOS 時(shí)間字符串&NSDate&時(shí)間戳 相互轉(zhuǎn)換
前段時(shí)間一直在和時(shí)間打交道,這幾天整理了一下幾個(gè)時(shí)間相互轉(zhuǎn)換的方法,再次做記錄
效果圖
時(shí)間戳轉(zhuǎn)字符串
+(NSString *)timeStampConversionNSString:(NSString *)timeStamp { NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeStamp longLongValue]/1000]; NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *dateStr = [formatter stringFromDate:date]; return dateStr; }
時(shí)間轉(zhuǎn)時(shí)間戳
+(NSString *)dateConversionTimeStamp:(NSDate *)date { NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[date timeIntervalSince1970]*1000]; return timeSp; }
字符串轉(zhuǎn)時(shí)間
+(NSDate *)nsstringConversionNSDate:(NSString *)dateStr { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; NSDate *datestr = [dateFormatter dateFromString:dateStr]; return datestr; }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
iOS應(yīng)用開(kāi)發(fā)中導(dǎo)航欄按鈕UIBarButtonItem的添加教程
這篇文章主要介紹了iOS應(yīng)用開(kāi)發(fā)中導(dǎo)航欄按鈕UIBarButtonItem的添加教程,文中詳細(xì)介紹了使用UINavigationController導(dǎo)航控制器添加的過(guò)程,需要的朋友可以參考下2016-02-02IOS 文件讀寫(xiě)操作詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了IOS 文件讀寫(xiě)操作詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04ios UITableView實(shí)現(xiàn)無(wú)數(shù)據(jù)加載占位圖片
這篇文章主要介紹了ios UITableView實(shí)現(xiàn)無(wú)數(shù)據(jù)占位圖片,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08理解Objective-C的變量以及面相對(duì)象的繼承特性
這篇文章主要介紹了理解Objective-C的變量以及面相對(duì)象的繼承特性,文中的所說(shuō)的點(diǎn)語(yǔ)法即是'對(duì)象名.成員變量名'這種對(duì)變量的訪問(wèn),需要的朋友可以參考下2016-01-01IOS 波紋進(jìn)度(waveProgress)動(dòng)畫(huà)實(shí)現(xiàn)
這篇文章主要介紹了IOS 紋進(jìn)度(waveProgress)動(dòng)畫(huà)實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-09-09iOS實(shí)現(xiàn)自定義購(gòu)物車(chē)角標(biāo)顯示購(gòu)物數(shù)量(添加商品時(shí)角標(biāo)抖動(dòng) Vie)
本文主要介紹了iOS實(shí)現(xiàn)自定義購(gòu)物車(chē)及角標(biāo)顯示購(gòu)物數(shù)量(添加商品時(shí)角標(biāo)抖動(dòng) Vie)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04IOS 解決推送本地國(guó)際化 loc-key 本地化失敗的問(wèn)題
本文主要介紹IOS 推送國(guó)際化問(wèn)題,在開(kāi)發(fā) IOS 項(xiàng)目過(guò)程中對(duì)軟件的國(guó)際化有的項(xiàng)目需求是需要的,這里給大家一個(gè)示例,有需要的小伙伴可以參考下2016-07-07iOS中的導(dǎo)航欄UINavigationBar與工具欄UIToolBar要點(diǎn)解析
UINavigation可以附著于導(dǎo)航控制器之中使用,也可以在controller中單獨(dú)使用,這里我們將來(lái)看iOS中的導(dǎo)航欄UINavigationBar與工具欄UIToolBar要點(diǎn)解析.2016-06-06iOS中多網(wǎng)絡(luò)請(qǐng)求的線程安全詳解
這篇文章主要給大家介紹了關(guān)于iOS中多網(wǎng)絡(luò)請(qǐng)求的線程安全的相關(guān)資料文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10