国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS NSDate中關于夏令時的坑

2020-07-26 02:24:18
字體:
來源:轉載
供稿:網友

前言

最近線上推廣項目的時候,運營反饋了幾個bug,其中一個就是字符串轉NSDate對象出現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就會轉化失敗,為null。

經查找資料,發現這個情況是由于夏令時引起的。

夏時令(Daylight Saving Time:DST),又稱“日光節約時制”和“夏令時間”,是一種為節約能源而人為規定地方時間的制度,在這一制度實行期間所采用的統一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。各個采納夏時制的國家具體規定不同。目前全世界有近110個國家每年要實行夏令時。

1986年4月,中國中央有關部門發出“在全國范圍內實行夏時制的通知”,具體作法是:每年從四月中旬第一個星期日的凌晨2時整(北京時間),將時鐘撥快一小時,即將表針由2時撥至3時,夏令時開始;到九月中旬第一個星期日的凌晨2時整(北京夏令時),再將時鐘撥回一小時,即將表針由2時撥至1時,夏令時結束。從1986年到1991年的六個年度,除1986年因是實行夏時制的第一年,從5月4日開始到9月14日結束外,其它年份均按規定的時段施行。在夏令時開始和結束前幾天,新聞媒體均刊登有關部門的通告。1992年起,夏令時暫停實行。

  • 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日

以上時間段都屬于夏令時,但是經過多次測試,這其中有的日子是可以轉化為NSDate的,目前只發現了6個日期會有問題。1991-04-14, 1986-05-04, 1987-04-12, 1989-04-16, 1990-04-15,1988-04-10(ps:沒有做覆蓋測試,可能還有更多)

解決方案:

一、使用GMT零時區

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];// 零時區[formatter setDateFormat:@"yyyy-MM-dd"];

二、設置lenient屬性

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];formatter.lenient = YES; // 這個屬性沒有官方的解釋,個人理解為:如果當前時間不存在的話,會默認獲取距離最近的整點時間[formatter setDateFormat:@"yyyy-MM-dd"];

iOS 時間字符串&NSDate&時間戳 相互轉換

前段時間一直在和時間打交道,這幾天整理了一下幾個時間相互轉換的方法,再次做記錄

效果圖



時間戳轉字符串

+(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;}

時間轉時間戳

+(NSString *)dateConversionTimeStamp:(NSDate *)date{NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[date timeIntervalSince1970]*1000];return timeSp;}

字符串轉時間

+(NSDate *)nsstringConversionNSDate:(NSString *)dateStr{NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];NSDate *datestr = [dateFormatter dateFromString:dateStr];return datestr;}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 教育| 临颍县| 南岸区| 岗巴县| 咸宁市| 日照市| 犍为县| 合作市| 怀远县| 墨江| 平罗县| 祁阳县| 九龙城区| 通山县| 嘉定区| 高邑县| 安西县| 茂名市| 威宁| 鹤峰县| 道真| 历史| 仪征市| 榆林市| 兴宁市| 南安市| 石景山区| 泾源县| 海林市| 景东| 高安市| 双鸭山市| 萨嘎县| 阳朔县| 舒城县| 开原市| 宝鸡市| 开鲁县| 三原县| 五指山市| 手游|