ios關(guān)于日期處理

最近在項目的開發(fā)的過程中遇到了關(guān)于ios日期處理的問題,直接上代碼,各位可以看一看這段代碼有沒有問題

NSDateFormatter *LocalDateFormatter = [[NSDateFormatter alloc] init];
LocalDateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSString *dateString = [LocalDateFormatter stringFromDate:[NSDate date]];

這段代碼一開始看感覺沒有什么問題,就是基本的對日期進行格式化,可是如果這個時候,我們把手機的日歷切換為日本日歷或者其他日歷(只要不是公歷),這段代碼就有可能有問題,我就以日本日歷為例。
正常情況下(手機一般為公歷)顯示的結(jié)果:
2016-03-08 **:**:**
但是如果用的時日本日歷,顯示結(jié)果:
0028-03-08 **:**:**
0028在日本代表但是,像中國古代康熙28年
所以,在我們工作過程中,需要指定相應(yīng)的日歷,區(qū)域,下面介紹一些常用的方式
NSCalendar
系統(tǒng)的設(shè)置 > 通用 > 多語言環(huán)境 > 日歷上述的日歷設(shè)置和NSCalendar是有直接關(guān)系的。
■比如設(shè)定成「日本日歷」的時候、currentCalendar的值是NSJapaneseCalendar
■設(shè)定成「公歷」的時候、currentCalendar的值是NSGregorianCalendar

注意:在程序中,currentCalendar取得的值會一直保持在cache中,第一次取得以后如果用戶修改該系統(tǒng)日歷設(shè)定,這個值也不會改變。如果用autoupdatingCurrentCalendar,那么每次取得的值都會是當(dāng)前系統(tǒng)設(shè)置的日歷的值。
通過Calendar可以設(shè)置TimeZone和Locale。
如果你要通過NSDateFormatter來設(shè)置日期格式,比如”yyyy-MM-dd”等,那需要注意對Formatter設(shè)置日歷。

如果想要用公歷的時候,就要將NSDateFormatter的日歷設(shè)置成公歷。否則隨著用戶的系統(tǒng)設(shè)置的改變,取得的日期的格式也會不一樣。

NSCalendar *calendar =[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];[formatter setCalendar:calendar];

NSLocale

[NSLocale currentLocale]
[NSLocale systemLocale]
[NSLocale autoUpdatingCurrentLocale]

NSLocale與下面的設(shè)置有關(guān):
系統(tǒng)的設(shè)置 > 通用 > 多語言環(huán)境 > 區(qū)域格式
系統(tǒng)的設(shè)置 > 通用 > 日期與時間 > 24小時制

根據(jù)國家區(qū)域的設(shè)置的不同,格式也會不一樣,例如:
中國: 「11月」 美國:「November」
中國: 「上午」 美國:「AM」

如果你的應(yīng)用程序在多個國家發(fā)布,那你就需要注意設(shè)置NSLocale。
比如:
[[NSLocale alloc] initWithLocaleIdentifier:@”en_US”]
cunnretLocale是用戶設(shè)定的值。
systemLocale是設(shè)備默認(rèn)的值。

NSDateFormatter
理解日期格式的設(shè)置非常重要。
有時候會遇到下面的情況:
比如你將格式設(shè)置成
@”yyyy-MM-dd HH:mm:ss”
但顯示出來的卻是
「0024-11-16 21:09:17」
(這個時候用戶把日歷設(shè)置成了日本日歷)

又或者顯示成
「2012-11-17 下午11:07:47」
(24小時制關(guān)閉的時候)

上述的情況如果不考慮到的話,那程序中就會出現(xiàn)bug。
如果將日期的格式的日歷設(shè)置成公歷,
NSDateFormatter 設(shè)置成 NSGregorianCalendar
需要用24小時制的時候,可以把Locale設(shè)置成systemLocale。
(如果你沒有特定需要指定的Locale的話)

<b>時間戳</b> timeIntervalSince1970
一、轉(zhuǎn)化時間戳方法:

NSString *timeSp = [NSString stringWithFormat:@"%d", (long)      [localeDate timeIntervalSince1970]];
NSLog(@"timeSp:%@",timeSp); //時間戳的值

二、把獲取的時間轉(zhuǎn)化為當(dāng)前時間

NSDate *datenow = [NSDate date];//現(xiàn)在時間,你可以輸出來看下是什么格式 
NSTimeZone *zone = [NSTimeZone systemTimeZone]; 
NSInteger interval = [zone secondsFromGMTForDate:datenow]; 
NSDate *localeDate = [datenow  dateByAddingTimeInterval: interval]; 
NSLog(@"%@", localeDate);  

三、時間戳轉(zhuǎn)換為時間的方法

NSDate *confirmTimesp = [NSDate dateWithTimeIntervalSince1970:136789745666];
NSLog(@"136789745666 = %@", confirmTimesp);

參考的博客:
http://kevin-wu.net/tag/nsdate/
http://www.cnblogs.com/wayne23/archive/2013/03/25/2981009.html
http://www.helloswift.com.cn/swiftbase/2015/0328/3532.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容