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

首頁(yè) > 系統(tǒng) > iOS > 正文

iOS NSDate中關(guān)于夏令時(shí)的坑

2019-10-21 18:39:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近線上推廣項(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)部門發(fā)出“在全國(guó)范圍內(nèi)實(shí)行夏時(shí)制的通知”,具體作法是:每年從四月中旬第一個(gè)星期日的凌晨2時(shí)整(北京時(shí)間),將時(shí)鐘撥快一小時(shí),即將表針由2時(shí)撥至3時(shí),夏令時(shí)開始;到九月中旬第一個(gè)星期日的凌晨2時(shí)整(北京夏令時(shí)),再將時(shí)鐘撥回一小時(shí),即將表針由2時(shí)撥至1時(shí),夏令時(shí)結(jié)束。從1986年到1991年的六個(gè)年度,除1986年因是實(shí)行夏時(shí)制的第一年,從5月4日開始到9月14日結(jié)束外,其它年份均按規(guī)定的時(shí)段施行。在夏令時(shí)開始和結(jié)束前幾天,新聞媒體均刊登有關(guā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)過多次測(cè)試,這其中有的日子是可以轉(zhuǎn)化為NSDate的,目前只發(fā)現(xiàn)了6個(gè)日期會(huì)有問題。1991-04-14, 1986-05-04, 1987-04-12, 1989-04-16, 1990-04-15,1988-04-10(ps:沒有做覆蓋測(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è)屬性沒有官方的解釋,個(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)換的方法,再次做記錄

效果圖

iOS,NSDate,夏令時(shí)

iOS,NSDate,夏令時(shí)

時(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à)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 澄城县| 大姚县| 抚顺市| 山东省| 黄平县| 大丰市| 柳州市| 老河口市| 合阳县| 井研县| 龙陵县| 若尔盖县| 蛟河市| 和田市| 青海省| 彰化市| 萨嘎县| 茌平县| 澳门| 郓城县| 漯河市| 福建省| 周至县| 托里县| 四平市| 临江市| 彭州市| 阿图什市| 莱阳市| 姜堰市| 邳州市| 乌拉特后旗| 休宁县| 孝义市| 淳化县| 客服| 长宁区| 丰都县| 绥芬河市| 银川市| 徐水县|