iOS NSDate中關(guān)于夏令時的坑
前言
最近線上推廣項目的時候,運(yùn)營反饋了幾個bug,其中一個就是字符串轉(zhuǎn)NSDate對象出現(xiàn)nil的情況。
舉個例子:
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就是用戶的生日,平時測試的時候,這塊代碼都是ok的。那么如果我們把生日換成1986-05-04,此時的date就會轉(zhuǎn)化失敗,為null。
經(jīng)查找資料,發(fā)現(xiàn)這個情況是由于夏令時引起的。
夏時令(Daylight Saving Time:DST),又稱“日光節(jié)約時制”和“夏令時間”,是一種為節(jié)約能源而人為規(guī)定地方時間的制度,在這一制度實(shí)行期間所采用的統(tǒng)一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間調(diào)快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個采納夏時制的國家具體規(guī)定不同。目前全世界有近110個國家每年要實(shí)行夏令時。
1986年4月,中國中央有關(guān)部門發(fā)出“在全國范圍內(nèi)實(shí)行夏時制的通知”,具體作法是:每年從四月中旬第一個星期日的凌晨2時整(北京時間),將時鐘撥快一小時,即將表針由2時撥至3時,夏令時開始;到九月中旬第一個星期日的凌晨2時整(北京夏令時),再將時鐘撥回一小時,即將表針由2時撥至1時,夏令時結(jié)束。從1986年到1991年的六個年度,除1986年因是實(shí)行夏時制的第一年,從5月4日開始到9月14日結(jié)束外,其它年份均按規(guī)定的時段施行。在夏令時開始和結(jié)束前幾天,新聞媒體均刊登有關(guān)部門的通告。1992年起,夏令時暫停實(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日
以上時間段都屬于夏令時,但是經(jīng)過多次測試,這其中有的日子是可以轉(zhuǎn)化為NSDate的,目前只發(fā)現(xiàn)了6個日期會有問題。1991-04-14, 1986-05-04, 1987-04-12, 1989-04-16, 1990-04-15,1988-04-10(ps:沒有做覆蓋測試,可能還有更多)
解決方案:
一、使用GMT零時區(qū)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];// 零時區(qū) [formatter setDateFormat:@"yyyy-MM-dd"];
二、設(shè)置lenient屬性
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.lenient = YES; // 這個屬性沒有官方的解釋,個人理解為:如果當(dāng)前時間不存在的話,會默認(rèn)獲取距離最近的整點(diǎn)時間 [formatter setDateFormat:@"yyyy-MM-dd"];
iOS 時間字符串&NSDate&時間戳 相互轉(zhuǎn)換
前段時間一直在和時間打交道,這幾天整理了一下幾個時間相互轉(zhuǎn)換的方法,再次做記錄
效果圖


時間戳轉(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;
}
時間轉(zhuǎn)時間戳
+(NSString *)dateConversionTimeStamp:(NSDate *)date
{
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[date timeIntervalSince1970]*1000];
return timeSp;
}
字符串轉(zhuǎn)時間
+(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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
詳解IOS 利用storyboard修改UITextField的placeholder文字顏色
這篇文章主要介紹了詳解IOS 利用storyboard修改UITextField的placeholder文字顏色的相關(guān)資料,希望通過本文能實(shí)現(xiàn)這樣類似的功能,需要的朋友可以參考下2017-08-08
iOS中的UITextView文字輸入光標(biāo)使用技巧小結(jié)
UITextView在用戶體驗方面有著十分明顯的作用,包括鍵盤的呼出及文字的選擇等,接下來就來整理給出一份iOS中的UITextView文字輸入光標(biāo)使用技巧小結(jié),需要的朋友可以參考下2016-05-05
UITextView實(shí)現(xiàn)只允許鏈接交互不允許選擇圖片的方法
這篇文章主要介紹了UITextView實(shí)現(xiàn)只允許鏈接交互不允許選擇圖片的方法,文中介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03
iOS tableview實(shí)現(xiàn)頂部拉伸效果
這篇文章主要為大家詳細(xì)介紹了iOS tableview實(shí)現(xiàn)頂部拉伸效果,以及頭部拉伸效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
iOS tableView右側(cè)索引視圖狀態(tài)獲取的方法實(shí)例
tableView用于顯示一個垂直滾動的單元格數(shù)(通常為可重復(fù)使用的單元格)組成的視圖,這篇文章主要給大家介紹了關(guān)于iOS tableView右側(cè)索引視圖狀態(tài)獲取的相關(guān)資料,需要的朋友可以參考下2021-07-07
iOS Runntime 動態(tài)添加類方法并調(diào)用-class_addMethod
這篇文章主要介紹了iOS Runntime 動態(tài)添加類方法并調(diào)用-class_addMethod的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08
iOS登錄時驗證手機(jī)號與倒計時發(fā)送驗證碼問題詳解
這篇文章主要給大家介紹了關(guān)于iOS登錄時驗證手機(jī)號與倒計時發(fā)送驗證碼問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2019-01-01

