最近在項目的開發(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