iOS 日期處理的相關(guān)類

GitHub: https://github.com/GardenerYun
Email: gardeneryun@foxmail.com
簡(jiǎn)書博客地址: http://www.reibang.com/users/8489e70e237d/latest_articles
如有問題或建議請(qǐng)聯(lián)系我斯议,我會(huì)馬上解決問題~ (? ??_??)?

索引

  1. NSDate - 表示一個(gè)絕對(duì)的時(shí)間點(diǎn)孝情,表示公歷的GMT時(shí)間(格林威治時(shí)間),獨(dú)立于任何特定的歷法系統(tǒng)或時(shí)間區(qū)奴潘。
  2. NSLoale - 本地化信息逗余,主要體現(xiàn)在"語言"和"區(qū)域格式"這兩個(gè)設(shè)置項(xiàng)斑鼻。
  3. NSTimeZone - 時(shí)區(qū)信息。
  4. NSCalendar - 日歷類猎荠,提供日歷的信息、大量日期計(jì)算的接口蜀备。
  5. NSDateComponents - 封裝date對(duì)象關(guān)于年月日時(shí)秒分关摇、周、季度等信息的類碾阁。
  6. NSDateFormatter - 由特定的格式输虱,用來在date和String之間轉(zhuǎn)換。

簡(jiǎn)書不支持目錄跳轉(zhuǎn)脂凶,有需要的請(qǐng)移步github

V1.1.0 - 16.07.19第三次更新 (公司項(xiàng)目開始開發(fā)新功能了... 更新只能放慢進(jìn)度)
重寫NSDate及其方法描述宪睹,更全更詳細(xì)。

V1.0.1 - 16.06.24第二次更新 (就是這么快)
更新:日歷的demo蚕钦、農(nóng)歷處理方法 (NSDate+LunarCalendar.h .m)

日歷

V1.0.0 - 16.06.23第一次更新
項(xiàng)目中日期處理使用的越來越多亭病,自己寫的方法不夠用了。開始使用DateTools(據(jù)說是最好用的日期處理庫),在研究源碼的時(shí)候嘶居,決定記錄下來罪帖。我只是重新造輪子。(會(huì)陸續(xù)更新簡(jiǎn)單日歷的demo、農(nóng)歷處理方法)

<a name="chapter1"/>
<h3 id="chapter1">NSDate - 表示一個(gè)絕對(duì)的時(shí)間點(diǎn)整袁,表示公歷的GMT時(shí)間(格林威治時(shí)間)菠齿,獨(dú)立于任何特定的歷法系統(tǒng)或時(shí)間區(qū)。 (2016-05-31 01:59:22 +0000)</h3>

1. NSDate - 初始化方法
- (id)init;
+ (id)date;
默認(rèn)初始化坐昙,返回當(dāng)前時(shí)間绳匀。

NSDate *date = [NSDate date];
// NSDate *date = [[NSDate alloc] init];    
NSLog(@"date = %@",date);
------------------------------------------------
date = 2016-05-31 02:21:22 +0000

- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;
+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
以當(dāng)前時(shí)間的偏移秒數(shù)來初始化。

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:60];
// NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:60];
NSLog(@"now = %@",[NSDate date]);
NSLog(@"date = %@",date);
------------------------------------------------
now = 2016-05-31 02:39:58 +0000
date = 2016-05-31 02:40:58 +0000

- (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;
+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;
以2001-01-01 00:00:00 +0000 為時(shí)間基準(zhǔn)炸客,偏移秒數(shù)來初始化疾棵。

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:120];
// NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:120];
NSLog(@"date = %@",date);
------------------------------------------------
date = 2001-01-01 00:02:00 +0000

- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;
+ (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
以1970-01-01 00:00:00 +0000 為時(shí)間基準(zhǔn),偏移秒數(shù)來初始化嚷量。

NSDate *date = [NSDate dateWithTimeIntervalSince1970:60];
// NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:60];
NSLog(@"date %@",date);
------------------------------------------------
date = 1970-01-01 00:01:00 +0000

2. NSDate - 日期比較的方法

- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;
將當(dāng)前對(duì)象與另一個(gè)NSDate對(duì)象比較陋桂,返回較早/較晚的時(shí)間點(diǎn),并以新NSDate對(duì)象的形式返回

NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:60];
NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:30];
NSDate *date3 = [NSDate dateWithTimeIntervalSince1970:30];
    
NSDate *earlierDate = [date1 earlierDate:date2];
    
NSDate *laterDate = [date1 laterDate:date2];
    
NSLog(@"earlierDate = %@", earlierDate);
NSLog(@"laterDate = %@", laterDate);

------------------------------------------------
earlierDate = 1970-01-01 00:00:30 +0000
laterDate = 1970-01-01 00:01:00 +0000

- (NSComparisonResult)compare:(NSDate *)other;
將當(dāng)前對(duì)象與另一個(gè)NSDate對(duì)象比較蝶溶,如果相同嗜历,返回0(NSOrderedSame);當(dāng)前對(duì)象時(shí)間早于參數(shù)時(shí)間抖所,返回-1(NSOrderedAscending)梨州;當(dāng)前對(duì)象時(shí)間晚于參數(shù)時(shí)間,返回1(NSOrderedDescending)

NSComparisonResult compResult = [date2 compare:date3];
    
NSLog(@"compResult = %ld", compResult);

------------------------------------------------
compResult = 0

- (BOOL)isEqualToDate:(NSDate *)otherDate;
將當(dāng)前對(duì)象與另一個(gè)NSDate對(duì)象比較田轧,根據(jù)是否相同返回BOOL值暴匠。

BOOL isEqual = [date2 isEqualToDate:date3];

NSLog(@"isEqual = %d", isEqual);
------------------------------------------------
isEqual = 1

3. NSDate - 其他屬性和方法

NSDate.h

// 2001-01-01 00:00:00 到 1970-01-01 00:00:00 的時(shí)間間隔
#define NSTimeIntervalSince1970  978307200.0     

// 當(dāng)前date對(duì)象于當(dāng)前時(shí)間 ([NSDate date]) 的時(shí)間間隔
@property (readonly) NSTimeInterval timeIntervalSinceNow;   

// 當(dāng)前date對(duì)象 與 1970-01-01 00:00:00 的時(shí)間間隔  (時(shí)間戳)
@property (readonly) NSTimeInterval timeIntervalSince1970;  

// 當(dāng)前date對(duì)象 與 2001-01-01 00:00:00 的時(shí)間間隔
@property (readonly) NSTimeInterval timeIntervalSinceReferenceDate; 

// 0000-12-30 00:00:00 +0000
+ (NSDate *)distantPast;

// 4001-01-01 00:00:00 +0000
+ (NSDate *)distantFuture;


<a name="chapter2"/>
<h3 id="chapter2">NSLoale - 本地化信息,主要體現(xiàn)在"語言"和"區(qū)域格式"這兩個(gè)設(shè)置項(xiàng)傻粘。 (個(gè)人認(rèn)為:不常用)</h3>

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

1. + (id)systemLocale
根據(jù)官方文檔每窖。設(shè)備默認(rèn)的本地化信息。當(dāng)不想用用戶設(shè)定的本地化信息時(shí)弦悉,使用systemLocale對(duì)象來設(shè)置你想要的效果窒典。


2. + (id)currentLocale
根據(jù)官方文檔。當(dāng)前用戶設(shè)定的本地化信息稽莉,即使修改了本地化設(shè)定瀑志,這個(gè)對(duì)象也不會(huì)改變。currentLocale取得的值可能被緩存在cache中污秆。


3. + (id)autoupdatingCurrentLocale
根據(jù)官方文檔劈猪。當(dāng)前用戶設(shè)定的本地化信息,此對(duì)象總是最新的本地化信息良拼。

- (IBAction)_printLocale:(id)sender {

    NSLocale *currentLocale = [NSLocale currentLocale];
    NSLocale *systemLocale = [NSLocale currentLocale];
    NSLocale *autoupdatingCurrentLocale = [NSLocale autoupdatingCurrentLocale];
    
    NSLog(@"currentLocale = %@",currentLocale);
    NSLog(@"systemLocale = %@",systemLocale);
    NSLog(@"autoupdatingCurrentLocale = %@",autoupdatingCurrentLocale);
    
    NSLog(@"currentLocale.localeIdentifier = %@",currentLocale.localeIdentifier);
    NSLog(@"systemLocale.localeIdentifier = %@",systemLocale.localeIdentifier);
    NSLog(@"autoupdatingCurrentLocale.localeIdentifie = %@",autoupdatingCurrentLocale.localeIdentifier);
}
------------------------------------------------
******設(shè)置 -> 通用 -> 語言與地區(qū) -> 高級(jí) -> 語言 -> 簡(jiǎn)體中文******
currentLocale = <__NSCFLocale: 0x7fc35150c570>
systemLocale = <__NSCFLocale: 0x7fc35150c570>
autoupdatingCurrentLocale = Auto-updating Locale <NSAutoLocale: 0x7fc35160fff0> [<__NSCFLocale: 0x7fc35150c570>]
currentLocale.localeIdentifier = zh_CN
systemLocale.localeIdentifier = zh_CN
autoupdatingCurrentLocale.localeIdentifie = zh_CN

真機(jī)手動(dòng)設(shè)置
******設(shè)置 -> 通用 -> 語言與地區(qū) -> 高級(jí) -> 語言 -> 英文******
currentLocale = <__NSCFLocale: 0x7fc35179d5a0>
systemLocale = <__NSCFLocale: 0x7fc35179d5a0>
autoupdatingCurrentLocale = Auto-updating Locale <NSAutoLocale: 0x7fc3517a1e10> [<__NSCFLocale: 0x7fc35179d5a0>]
currentLocale.localeIdentifier = en_CN
systemLocale.localeIdentifier = en_CN
autoupdatingCurrentLocale.localeIdentifie = en_CN

我用系統(tǒng)為iOS9.3的真機(jī)和模擬器測(cè)試這三個(gè)初始化(單例)方法战得。個(gè)人得出的結(jié)果是:currentLocale、systemLocale內(nèi)存地址一樣将饺。autoupdatingCurrentLocale指向的貌似是拷貝currentLocale地址的內(nèi)容新生成的地址贡避。不做特殊處理痛黎,使用這三個(gè)是沒什么區(qū)別的。(建議使用autoupdatingCurrentLocale)


*4. - (id)initWithLocaleIdentifier:(NSString )string;
用標(biāo)示符初始化本地化信息
如果你的應(yīng)用程序在多個(gè)國家發(fā)布刮吧,那你就需要注意設(shè)置NSLocale湖饱。
比如:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@”en_US”];

<a name="chapter3"/>
<h3 id="chapter3">NSTimeZone - 時(shí)區(qū)信息。 (個(gè)人認(rèn)為:不常用) </h3>

NSTimeZone與設(shè)備的設(shè)置有關(guān):
系統(tǒng)的設(shè)置 > 通用 > 日期與時(shí)間 > 時(shí)區(qū)
1. + (NSTimeZone *)systemTimeZone;
設(shè)備系統(tǒng)時(shí)區(qū)杀捻,不能代碼修改井厌。(大伙的iPhone都是自動(dòng)默認(rèn)北京,如在手機(jī)‘設(shè)置’修改為倫敦致讥,返回倫敦時(shí)區(qū))


2. + (NSTimeZone *)localTimeZone;
本地時(shí)區(qū)仅仆,默認(rèn)與systemTimeZone一致,可用代碼修改垢袱。


3. + (NSTimeZone *)defaultTimeZone;
默認(rèn)時(shí)區(qū)墓拜,程序中定義的默認(rèn)時(shí)區(qū),默認(rèn)與默認(rèn)與systemTimeZone一致请契,可用代碼修改咳榜。

- (IBAction)_printTimeZone:(id)sender {
    NSLog(@"localTimeZone = %p  %@",[NSTimeZone localTimeZone], [NSTimeZone localTimeZone]);
    NSLog(@"systemTimeZone = %p  %@",[NSTimeZone systemTimeZone], [NSTimeZone systemTimeZone]);
    NSLog(@"defaultTimeZone = %p  %@",[NSTimeZone defaultTimeZone], [NSTimeZone defaultTimeZone]);
}
------------------------------------------------
******設(shè)置 -> 通用 -> 日期與時(shí)間 -> 時(shí)區(qū) -> 北京******
localTimeZone = 0x157503690  Local Time Zone (Asia/Shanghai (GMT+8) offset 28800)
systemTimeZone = 0x1575a44e0  Asia/Shanghai (GMT+8) offset 28800
defaultTimeZone = 0x1575a44e0  Asia/Shanghai (GMT+8) offset 28800

真機(jī)手動(dòng)設(shè)置
******設(shè)置 -> 通用 -> 日期與時(shí)間 -> 時(shí)區(qū) -> 倫敦******
localTimeZone = 0x157503690  Local Time Zone (Europe/London (GMT+1) offset 3600 (Daylight))
systemTimeZone = 0x157502d50  Europe/London (GMT+1) offset 3600 (Daylight)
defaultTimeZone = 0x157502d50  Europe/London (GMT+1) offset 3600 (Daylight)

4. + (void)setDefaultTimeZone:(NSTimeZone *)aTimeZone;
用此方法可以改變localTimeZone、defaultTimeZone的值爽锥,(systemTimeZone不可改變)

- (IBAction)_printTimeZone:(id)sender {

    NSLog(@"localTimeZone = %p  %@",[NSTimeZone localTimeZone], [NSTimeZone localTimeZone]);
    NSLog(@"systemTimeZone = %p  %@",[NSTimeZone systemTimeZone], [NSTimeZone systemTimeZone]);
    NSLog(@"defaultTimeZone = %p  %@",[NSTimeZone defaultTimeZone], [NSTimeZone defaultTimeZone]);
    
    [NSTimeZone setDefaultTimeZone:[[NSTimeZone alloc] initWithName:@"America/Chicago"]];
    
    NSLog(@"localTimeZone = %p  %@",[NSTimeZone localTimeZone], [NSTimeZone localTimeZone]);
    NSLog(@"systemTimeZone = %p  %@",[NSTimeZone systemTimeZone], [NSTimeZone systemTimeZone]);
    NSLog(@"defaultTimeZone = %p  %@",[NSTimeZone defaultTimeZone], [NSTimeZone defaultTimeZone]);
}
------------------------------------------------
localTimeZone = 0x15fd05bf0  Local Time Zone (Asia/Shanghai (GMT+8) offset 28800)
systemTimeZone = 0x15fd0d310  Asia/Shanghai (GMT+8) offset 28800
defaultTimeZone = 0x15fd0d310  Asia/Shanghai (GMT+8) offset 28800

localTimeZone = 0x15fd05bf0  Local Time Zone (America/Chicago (GMT-5) offset -18000 (Daylight))
systemTimeZone = 0x15fd0d310  Asia/Shanghai (GMT+8) offset 28800
defaultTimeZone = 0x15fd87910  America/Chicago (GMT-5) offset -18000 (Daylight)

<a name="chapter4"/>
<h3 id="chapter4">NSCalendar - 日歷類涌韩,提供日歷的信息、大量日期計(jì)算的接口氯夷。 </h3>

創(chuàng)建與常見屬性

1. + (NSCalendar *)currentCalendar;
為當(dāng)前用戶邏輯的日歷臣樱。即使修改了系統(tǒng)設(shè)置,這個(gè)對(duì)象也不會(huì)改變腮考。currentCalendar取得的值可能被緩存在cache中雇毫。


2. + (NSCalendar *)autoupdatingCurrentCalendar;
為當(dāng)前用戶邏輯的日歷。當(dāng)每次修改系統(tǒng)日歷設(shè)定踩蔚,其實(shí)例化的對(duì)象也會(huì)隨之改變嘴拢。


*3. - (id)initWithCalendarIdentifier:(NSString )string;
指定標(biāo)識(shí)符創(chuàng)建日歷對(duì)象。
(下表為部分歷法寂纪,詳情見Calendar Identifiers)

NSCalendarIdentifierGregorian 公歷 (陽歷)
NSCalendarIdentifierChinese 中國農(nóng)歷
NSCalendarIdentifierBuddhist 佛教日歷
NSCalendarIdentifierIndian 印度日歷
NSCalendarIdentifierRepublicOfChina 中華民國日歷(中國臺(tái)灣)

4. 屬性 NSUInteger firstWeekday;
設(shè)置日歷中顯示的每周的第一天從星期幾開始,比如:1代表星期日開始赌结,2代表星期一開始捞蛋,3代表星期二開始,以此類推柬姚。默認(rèn)值是1拟杉。 (此屬性在下文NSDateComponents還有說明)

calendar.firstWeekday默認(rèn)值為1,代表日歷顯示星期日開始量承,日歷的表現(xiàn)形式為:

星期日

設(shè)置calendar.firstWeekday = 2搬设,代表日歷顯示星期一開始穴店,日歷的表現(xiàn)形式為:

星期一

設(shè)置calendar.firstWeekday = 3,代表日歷顯示星期二開始拿穴,日歷的表現(xiàn)形式為:

星期二

5. 屬性 NSUInteger minimumDaysInFirstWeek;
設(shè)置每年及每月第一周必須包含的最少天數(shù)泣洞,默認(rèn)為1,即為第一周最少包括1天默色。


歷法計(jì)算

1. - (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
date對(duì)象由一個(gè)小的單位在一個(gè)大的單位里面的序數(shù)球凰。
<a name="NSCalendarUnit"/>
NSCalendarUnit包含的值有:
<h3 id="NSCalendarUnit"></h3>

NSCalendarUnitEra               = 紀(jì)元單位,
NSCalendarUnitYear              = 年單位。值很大腿宰。(2016)年
NSCalendarUnitMonth             = 月單位呕诉。范圍為1-12
NSCalendarUnitDay               = 天單位。范圍為1-31
NSCalendarUnitHour              = 小時(shí)單位吃度。范圍為0-24
NSCalendarUnitMinute            = 分鐘單位甩挫。范圍為0-60
NSCalendarUnitSecond            = 秒單位。范圍為0-60
NSCalendarUnitWeekday           = 星期單位椿每。范圍為1-7 (一個(gè)星期有七天)
NSCalendarUnitWeekdayOrdinal    = 以7天為單位伊者,范圍為1-5 (1-7號(hào)為第1個(gè)7天,8-14號(hào)為第2個(gè)7天...)
NSCalendarUnitQuarter           = 刻鐘單位拖刃。范圍為1-4 (1刻鐘等于15分鐘)
NSCalendarUnitWeekOfMonth       = 月包含的周數(shù)删壮。最多為6個(gè)周
NSCalendarUnitWeekOfYear        = 年包含的周數(shù)。最多為53個(gè)周
NSCalendarUnitYearForWeekOfYear = 暫未深究...
NSCalendarUnitNanosecond        = 納秒單位
NSCalendarUnitCalendar          = 暫未深究...
NSCalendarUnitTimeZone          = 暫未深究...

下面一些例子:

  • 當(dāng)小單位為NSCalendarUnitWeekday兑牡,大單位為NSCalendarUnitWeekOfMonth時(shí)(即某個(gè)日期在這一周是第幾天)央碟,根據(jù)firstWeekday屬性不同,返回的結(jié)果也不同.
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *date = [NSDate date]; // 2016-06-07 星期二
    
calendar.firstWeekday = 1;
NSInteger count1 = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:date];
NSLog(@"firstWeekday = %ld, count1 = %ld", calendar.firstWeekday, count1);
    
calendar.firstWeekday = 2;
NSInteger count2 = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:date];
NSLog(@"firstWeekday = %ld, count2 = %ld", calendar.firstWeekday, count2);
------------------------------------------------
firstWeekday = 1, count1 = 3  // 以星期天為第一天均函,3即為星期二
firstWeekday = 2, count2 = 2  // 以星期一為第一天亿虽,2即為星期二

2. - (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
date對(duì)象由一個(gè)小的單位在一個(gè)大的單位里面的取值范圍。


**3. - (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate * __nullable * __nullable)datep interval:(nullable NSTimeInterval )tip forDate:(NSDate )date;
原始時(shí)間點(diǎn)根據(jù)日歷單位計(jì)算出開始時(shí)間點(diǎn)苞也、秒數(shù)差洛勉。如果能計(jì)算返回YES,不能返回NO如迟。開始時(shí)間點(diǎn)跟秒數(shù)差通過參數(shù)返回收毫。
unit - 日歷單位
datep - 開始時(shí)間,傳入date對(duì)象的指針地址殷勘,通過參數(shù)返回此再。
tip - 秒數(shù)差,傳入秒數(shù)的指針地址玲销,通過參數(shù)返回输拇。
date - 原始時(shí)間點(diǎn)參數(shù)


<a name="chapter5"/>
<h3 id="chapter5">NSDateComponents - 封裝date對(duì)象關(guān)于年月日時(shí)秒分、周贤斜、季度等信息的類</h3>

以下屬性與NSCalendarUnit對(duì)應(yīng)

@property NSInteger era;
@property NSInteger year;
@property NSInteger month;
@property NSInteger day;
@property NSInteger hour;
@property NSInteger minute;
@property NSInteger second;
@property NSInteger nanosecond;
@property NSInteger weekday;
@property NSInteger weekdayOrdinal;
@property NSInteger quarter;
@property NSInteger weekOfMonth;
@property NSInteger weekOfYear;
@property NSInteger yearForWeekOfYear;

NSDateComponents本身沒有提供很多方法策吠,它的相關(guān)方法大部分是其他類提供的逛裤。以下方法都是NSCalendar類的
1. - (nullable NSDate *)dateFromComponents:(NSDateComponents *)comps;
設(shè)置dateComponents,由calendar獲得特定的date對(duì)象猴抹。

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.year = 2020;
dateComponents.month = 10;
dateComponents.day = 01;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:dateComponents];
NSLog(@"%@",date);

------------------------------------------------
2020-09-30 16:00:00 +0000

2. - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
date對(duì)象根據(jù)指定的unitFlags带族,得到相應(yīng)信息的dateComponents (沒有指定的unitFlags,對(duì)應(yīng)的dateComponents是沒有值的)

NSUInteger unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday ;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:unit fromDate:date];

NSLog(@"year    = %ld",dateComponents.year);
NSLog(@"month   = %ld",dateComponents.month);
NSLog(@"day     = %ld",dateComponents.day);
NSLog(@"hour    = %ld",dateComponents.hour);
NSLog(@"minute  = %ld",dateComponents.minute);
NSLog(@"second  = %ld",dateComponents.second);
NSLog(@"weekday = %ld",dateComponents.weekday);
NSLog(@"(沒有設(shè)置此unit)weekdayOrdinal    = %ld",dateComponents.weekdayOrdinal);    
NSLog(@"(沒有設(shè)置此unit)quarter           = %ld",dateComponents.quarter);
NSLog(@"(沒有設(shè)置此unit)weekOfMonth       = %ld",dateComponents.weekOfMonth);
NSLog(@"(沒有設(shè)置此unit)weekOfYear        = %ld",dateComponents.weekOfYear);
NSLog(@"(沒有設(shè)置此unit)yearForWeekOfYear = %ld",dateComponents.yearForWeekOfYear);
    
------------------------------------------------
year    = 2016
month   = 6
day     = 8
hour    = 11
minute  = 35
second  = 41
weekday = 4
(沒有設(shè)置此unit)weekdayOrdinal    = 9223372036854775807
(沒有設(shè)置此unit)quarter           = 9223372036854775807
(沒有設(shè)置此unit)weekOfMonth       = 9223372036854775807
(沒有設(shè)置此unit)weekOfYear        = 9223372036854775807
(沒有設(shè)置此unit)yearForWeekOfYear = 9223372036854775807

3. - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
根據(jù)指定的unitFlags洽糟,計(jì)算兩個(gè)date對(duì)應(yīng)components信息的差值炉菲。

NSUInteger unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *todate = [NSDate date]; // 2016-06-08

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.year = 2016;
dateComponents.month = 01;
dateComponents.day = 01;

NSDate *earlierDate = [calendar dateFromComponents:dateComponents];

NSDateComponents *components = [calendar components:unit fromDate:earlierDate toDate:todate options:0];
NSLog(@"year差 = %ld",components.year);
NSLog(@"month差 = %ld",components.month);
NSLog(@"day差 = %ld",components.day);

------------------------------------------------
year差 = 0
month差 = 5
day差 = 7

<a name="chapter6"/>
<h3 id="chapter6">NSDateFormatter - 由特定的格式,用來在date和String之間轉(zhuǎn)換坤溃。 </h3>

1. - (NSString *)stringFromDate:(NSDate *)date;
2. - (nullable NSDate *)dateFromString:(NSString *)string;
NSDateFormatter的兩個(gè)最實(shí)用的方法是dateFromString和stringFromDate拍霜,前者將string經(jīng)過格式化后變成NSDate對(duì)象,后者將NSDate對(duì)象格式化成string薪介。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *date1 = [NSDate date];
NSString *string1 = [formatter stringFromDate:date1];
NSLog(@"date1 = %@", date1);
NSLog(@"string1 = %@", string1);
    
NSString *string2 = @"2020-10-01 08:00:00 +0800";
NSDate *date2 = [formatter dateFromString:string2];
NSLog(@"date2 = %@", date2);
NSLog(@"string2 = %@", string2);
    
date1 = 2016-06-02 06:45:03 +0000
string1 = 2016-06-02 14:45:03 +0800
date2 = 2020-10-01 00:00:00 +0000
string2 = 2020-10-01 08:00:00 +0800

常用格式

y -- 年
假如是2013年祠饺,那么yyyy=2013,yy=13  

M -- 月 
假如是3月汁政,那么M=3道偷,MM=03,MMM=Mar记劈,MMMM=March
假如是11月勺鸦,那么M=11,MM=11目木,MMM=Nov换途,MMMM=November

d -- 這個(gè)月中的第幾天
假如是5號(hào),那么d=5刽射,dd=05
假如是15號(hào)军拟,那么d=15,dd=15

a -- 上午(AM)/下午(PM)
    
G -- 紀(jì)元
一般會(huì)顯示公元前(BC)和公元(AD)

H -- 24小時(shí)制誓禁,顯示為0--23
假如是午夜00:40懈息,那么H=0:40,HH=00:40

h -- 12小時(shí)制摹恰,顯示為1--12
假如是午夜00:40辫继,那么h=12:40

m -- 分鐘
假如是5分鐘,那么m=5俗慈,mm=05
假如是45分鐘骇两,那么m=45,mm=45

s -- 秒
假如是5秒鐘姜盈,那么s=5,ss=05
假如是45秒鐘配阵,那么s=45馏颂,ss=45

z -- 時(shí)區(qū)
表現(xiàn)形式為GMT+08:00
 
Z -- 時(shí)區(qū)
表現(xiàn)形式為+0800

不常用的

w -- 年包含的周
假如是1月8日示血,那么w=2(這一年的第二個(gè)周)

W -- 月份包含的周(與日歷排列有關(guān))
假如是2013年4月21日,那么W=4(這個(gè)月的第四個(gè)周)

F -- 月份包含的周(與日歷排列無關(guān))
和上面的W不一樣救拉,F(xiàn)只是單純以7天為一個(gè)單位來統(tǒng)計(jì)周难审,例如7號(hào)一定是第一個(gè)周,15號(hào)一定是第三個(gè)周亿絮,與日歷排列無關(guān)告喊。

D -- 在這一年中的第幾天
假如是1月20日,那么D=20(這一年的第20天)
假如是2月25日派昧,那么D=31+25=56(這一年的第56天)

E -- 星期 
假如是星期五黔姜,那么E=Fri,EEEE=Friday

K -- 12小時(shí)制蒂萎,顯示為0--11
假如是午夜00:40秆吵,那么K=0:40,KK=00:40

k -- 24小時(shí)制五慈,顯示為1--24
假如是午夜00:40纳寂,那么k=24:40

S -- 毫秒   
一般用SSS來顯示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泻拦,隨后出現(xiàn)的幾起案子毙芜,更是在濱河造成了極大的恐慌,老刑警劉巖争拐,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腋粥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陆错,警方通過查閱死者的電腦和手機(jī)灯抛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來音瓷,“玉大人对嚼,你說我怎么就攤上這事∩鳎” “怎么了纵竖?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杏愤。 經(jīng)常有香客問我靡砌,道長(zhǎng),這世上最難降的妖魔是什么珊楼? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任通殃,我火速辦了婚禮,結(jié)果婚禮上厕宗,老公的妹妹穿的比我還像新娘画舌。我一直安慰自己堕担,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布曲聂。 她就那樣靜靜地躺著霹购,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朋腋。 梳的紋絲不亂的頭發(fā)上齐疙,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音旭咽,去河邊找鬼贞奋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛轻专,可吹牛的內(nèi)容都是我干的忆矛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼请垛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼催训!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宗收,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤漫拭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后混稽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體采驻,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年匈勋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了礼旅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洽洁,死狀恐怖痘系,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饿自,我是刑警寧澤汰翠,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站昭雌,受9級(jí)特大地震影響复唤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烛卧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一佛纫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦呈宇、人聲如沸跟磨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哎榴,卻和暖如春型豁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尚蝌。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工迎变, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飘言。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓衣形,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親姿鸿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谆吴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容