iOSNSDate中關(guān)于夏令時的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下iOS NSDate中關(guān)于夏令時的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的廣水網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

前言

最近線上推廣項(xiàng)目的時候,運(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)換的方法,再次做記錄

效果圖

iOS NSDate中關(guān)于夏令時的示例分析

iOS NSDate中關(guā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;
}

以上是“iOS NSDate中關(guān)于夏令時的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站bm7419.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:iOSNSDate中關(guān)于夏令時的示例分析-創(chuàng)新互聯(lián)
文章出自:http://bm7419.com/article46/ddjphg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司搜索引擎優(yōu)化、網(wǎng)站排名、小程序開發(fā)、網(wǎng)站策劃、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)