DateTools_下載git
DateTools是Objective-C中簡化日期和時間處理的工具.github
CocoaPodspod 'DateTools'
objective-c
手動安裝
DataTools所需的全部類包含在DataTools文件夾下,以下:數組
DateTools.h
ide
NSDate+DateTools.{h,m}
工具
DTConstants.h
spa
DTError.{h,m}
code
DTTimePeriod.{h,m}
orm
DTTimePeriodGroup.{h,m}
對象
DTTimePeriodCollection.{h,m}
DTTimePeriodChain.{h,m}
若是你的工程想要支持國際化或者使用"TimeAgo"功能必需要導入bundle文件
你能夠在工程中Info下添加Localizations來添加支持的語言
DateTools.bundle
DateTools.h
包含了全部其餘文件的頭文件.在你的工程中導入DateTools.h頭文件便可
NSDate+DateTools
Time Periods
Time Period Groups
Time ago 就是將日期轉變爲相對日期的形式,即咱們經常使用的「昨天、今天、明天、幾天前,一週之後……」這樣的表述方式。
NSDate *timeAgoDate = [NSDate dateWithTimeIntervalSinceNow:-4]; NSLog(@"Time Ago: %@", timeAgoDate.timeAgoSinceNow); NSLog(@"Time Ago: %@", timeAgoDate.shortTimeAgoSinceNow); //輸出: //Time Ago: 4 seconds ago //Time Ago: 4s //設置好支持中文輸出: //Time Ago: 4秒鐘前 //Time Ago: 4秒
DateTools提供了多達33種語言的支持
若是想修改相對日期顯示的文字,能夠修改DateTools/Resources/DateTools.bundle下相應的文件
下圖以簡體中文爲例:
獲取日期的組成部分:
NSDate *date = [NSDate date]; NSInteger year = date.year; NSInteger month = date.month; NSInteger day = date.day; NSInteger hour = date.hour; NSInteger minute = date.minute; NSInteger second = date.second; NSLog(@"year:%ld month:%ld day:%ld hour:%ld minute:%ld second:%ld", year, month, day, hour, minute, second); //輸出: year:2016 month:5 day:23 hour:10 minute:54 second:1
DateTools默認日曆爲公曆!!!
使用其餘日曆:
(若是想全局使用其餘日曆,修改DateTools默認日曆,能夠改寫NSDate+DateTools.m
中的defaultCalendar
方法)
/** * 使用中國農曆 */ NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar]; NSDate *date = [NSDate date]; NSInteger year = [date yearWithCalendar:calendar]; NSInteger month = [date monthWithCalendar:calendar]; NSInteger day = [date dayWithCalendar:calendar]; NSInteger hour = [date hourWithCalendar:calendar]; NSInteger minute = [date minuteWithCalendar:calendar]; NSInteger second = [date secondWithCalendar:calendar]; NSLog(@"農曆: %ld-%ld-%ld %ld:%ld:%ld", year, month, day, hour, minute, second); NSLog(@"公曆: %ld-%ld-%ld %ld:%ld:%ld", date.year, date.month, date.day, date.hour, date.minute, date.second); //輸出: 農曆: 33-4-17 11:41:51 //輸出: 公曆: 2016-5-23 11:41:51
對日期進行編輯(年,月,日,星期,時,分,秒)
增長/減小方法:
/** * 日期增長1年 */ NSDate *date = [NSDate date]; NSDate *newDate = [date dateByAddingYears:1]; NSLog(@"year:%ld newYear:%ld", date.year, newDate.year); //輸出: year:2016 newYear:2017
比較兩個日期大小返回一個布爾值:
更多日期比較方法:
(很容易的獲得兩個日期相差的年,月,星期,日,時,分,秒)
formattedDateWithStyle:(系統格式)
formattedDateWithFormat:(自定義格式)
/** * formattedDateWithStyle(系統格式) */ NSDate *date = [NSDate date]; NSString *dateStringNo = [date formattedDateWithStyle:NSDateFormatterNoStyle]; NSString *dateStringShort = [date formattedDateWithStyle:NSDateFormatterShortStyle]; NSString *dateStringMedium = [date formattedDateWithStyle:NSDateFormatterMediumStyle]; NSString *dateStringLong = [date formattedDateWithStyle:NSDateFormatterLongStyle]; NSString *dateStringFull = [date formattedDateWithStyle:NSDateFormatterFullStyle]; NSLog(@"No: %@", dateStringNo); //輸出: No: NSLog(@"Short: %@", dateStringShort); //輸出: Short: 16/5/23 NSLog(@"Medium: %@", dateStringMedium); //輸出: Medium: 2016年5月23日 NSLog(@"Long: %@", dateStringLong); //輸出: Long: 2016年5月23日 NSLog(@"Full: %@", dateStringFull); //輸出: Full: 2016年5月23日 星期一 /** * formattedDateWithFormat(自定義格式) */ NSString *dateStringCustom1 = [date formattedDateWithFormat:@"yyyy-MM-dd"]; NSString *dateStringCustom2 = [date formattedDateWithFormat:@"yyyy年MM月dd日"]; NSString *dateStringCustom3 = [date formattedDateWithFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *dateStringCustom4 = [date formattedDateWithFormat:@"yyyy年MM月dd日 HH:mm:ss"]; NSString *dateStringCustom5 = [date formattedDateWithFormat:@"yyyy年MM月dd日 HH點mm分ss秒"]; NSLog(@"Custom1: %@", dateStringCustom1); //輸出: Custom1: 2016-05-23 NSLog(@"Custom2: %@", dateStringCustom2); //輸出: Custom2: 2016年05月23日 NSLog(@"Custom3: %@", dateStringCustom3); //輸出: Custom3: 2016-05-23 13:42:53 NSLog(@"Custom4: %@", dateStringCustom4); //輸出: Custom4: 2016年05月23日 13:42:53 NSLog(@"Custom5: %@", dateStringCustom5); //輸出: Custom5: 2016年05月23日 13點42分53秒
字符 | 說明 |
---|---|
yy | 年的後2位 |
yyyy | 完全年 |
M | 1~12 月(不帶0) |
MM | 1~12 月(帶0) |
MMM | Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec (1~12月_簡寫) |
MMMM | January/February/March/April/May/June/July/August/September/October/November/December (1~12月_全寫) |
d | 1~31 日(不帶0) |
dd | 1~31 日(帶0) |
EEE | Sun/Mon/Tue/Wed/Thu/Fri/Sat (星期_簡寫) |
EEEE | Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday (星期_全寫) |
aa | AM/PM (上午/下午) |
H | 0~23 時(24小時制,不帶0) |
HH | 0~23 時(24小時制,帶0) |
h | 1~12 時(12小時制,不帶0) |
hh | 1~12 時(24小時制,帶0) |
m | 0~59 分(不帶0) |
mm | 0~59 分(帶0) |
s | 0~59 秒(不帶0) |
ss | 0~59 秒(帶0) |
S | 毫秒 |
DateTools提供DTTimePeriod來簡化時間段的操做
/** * 經過起始時間來初始化時間段 */ NSDate *startDate = [NSDate date]; NSDate *endDate = [startDate dateByAddingHours:2]; DTTimePeriod *timePeriod =[[DTTimePeriod alloc] initWithStartDate:startDate endDate:endDate]; BOOL hasStartDate = timePeriod.hasStartDate; //是否有開始時間 BOOL hasEndDate = timePeriod.hasEndDate; //是否有結束時間 BOOL isMoment = timePeriod.isMoment; //是否開始時間和結束時間相同 double durationInYears = [timePeriod durationInYears]; //相差年 double durationInWeeks = [timePeriod durationInWeeks]; //相差周 double durationInDays = [timePeriod durationInDays]; //相差日 double durationInHours = [timePeriod durationInHours]; //相差小時 double durationInMinutes = [timePeriod durationInMinutes]; //相差分 double durationInSeconds = [timePeriod durationInSeconds]; //相差秒 NSLog(@"%f年 %f周 %f日 %f小時 %f分 %f秒",durationInYears, durationInWeeks, durationInDays, durationInHours, durationInMinutes, durationInSeconds); //輸出: 0.000000年 0.000000周 0.000000日 2.000000小時 120.000000分 7200.000000秒
更多初始化時間段方法:
移動時間段:
shiftEarlierWithSize 時間段總體前移
shiftLaterWithSize 時間段總體後移
/** * 移動時間段 */ NSDate *startDate = [NSDate date]; NSDate *endDate = [startDate dateByAddingDays:2]; DTTimePeriod *timePeriod =[[DTTimePeriod alloc] initWithStartDate:startDate endDate:endDate]; NSLog(@"開始:%@", [timePeriod.StartDate formattedDateWithStyle:NSDateFormatterMediumStyle]); NSLog(@"結束:%@", [timePeriod.EndDate formattedDateWithStyle:NSDateFormatterMediumStyle]); //輸出: 開始:2016年5月23日 //輸出: 結束:2016年5月25日 [timePeriod shiftEarlierWithSize:DTTimePeriodSizeDay]; //提早1天 NSLog(@"開始:%@", [timePeriod.StartDate formattedDateWithStyle:NSDateFormatterMediumStyle]); NSLog(@"結束:%@", [timePeriod.EndDate formattedDateWithStyle:NSDateFormatterMediumStyle]); //輸出: 開始:2016年5月22日 //輸出: 結束:2016年5月24日 [timePeriod shiftLaterWithSize:DTTimePeriodSizeDay amount:2]; //延後2天 NSLog(@"開始:%@", [timePeriod.StartDate formattedDateWithStyle:NSDateFormatterMediumStyle]); NSLog(@"結束:%@", [timePeriod.EndDate formattedDateWithStyle:NSDateFormatterMediumStyle]); //輸出: 開始:2016年5月24日 //輸出: 結束:2016年5月26日
延長/縮短期段:
shortenWithAnchorDate 延長(開始時間/中間時間/結束時間)
lengthenWithAnchorDate 縮短(開始時間/中間時間/結束時間)
/** * 時間段延長/縮短 */ NSDate *startDate = [NSDate date]; NSDate *endDate = [startDate dateByAddingDays:2]; DTTimePeriod *timePeriod =[[DTTimePeriod alloc] initWithStartDate:startDate endDate:endDate]; NSLog(@"時長: %.2f天", [timePeriod durationInDays]); //輸出: 時長: 2.00天 [timePeriod lengthenWithAnchorDate:DTTimePeriodAnchorEnd size:DTTimePeriodSizeDay amount:1]; //延長1天(增長結束時間) NSLog(@"時長: %.2f天", [timePeriod durationInDays]); //輸出: 時長: 3.00天 [timePeriod shortenWithAnchorDate:DTTimePeriodAnchorStart size:DTTimePeriodSizeDay amount:4]; //縮短4天(減小開始時間) NSLog(@"時長: %.2f天", [timePeriod durationInDays]); //輸出: 時長: 0.00天
兩個時間段關係相關方法:
兩個時間段關係全部可能性:
時間段關係枚舉DTTimePeriodRelation:
/** * DTTimePeriodRelation時間段關係枚舉 */ typedef NS_ENUM(NSUInteger, DTTimePeriodRelation){ DTTimePeriodRelationAfter, DTTimePeriodRelationStartTouching, DTTimePeriodRelationStartInside, DTTimePeriodRelationInsideStartTouching, DTTimePeriodRelationEnclosingStartTouching, DTTimePeriodRelationEnclosing, DTTimePeriodRelationEnclosingEndTouching, DTTimePeriodRelationExactMatch, DTTimePeriodRelationInside, DTTimePeriodRelationInsideEndTouching, DTTimePeriodRelationEndInside, DTTimePeriodRelationEndTouching, DTTimePeriodRelationBefore, DTTimePeriodRelationNone };
DateTools提供兩種時間段組類:
DTTimePeriodCollection 時間段集合 (容許存儲彼此有交集的時間段)
DTTimePeriodChain 時間段連接 (不容許存儲彼此有交集的時間段)DTTimePeriodCollection和DTTimePeriodChain就像NSArray同樣,你能夠像操做數組同樣對它們中的DTTimePeriod對象進行添加,插入,刪除,不一樣之處在於如何處理時間段
一個規則相對寬鬆的時間段集合
默認是無序的,可是支持經過調用方法排序
有本身的屬性,例如StartDate和EndDate屬性是根據內部時間段推測出來的
容許存儲有重疊的時間段
//時間段集合 DTTimePeriodCollection *timePeriodCollection = [DTTimePeriodCollection collection]; /** * 時間段 * * 當前時間爲: 2016年5月24日 */ DTTimePeriod *timePeriod1 = [DTTimePeriod timePeriodWithSize:DTTimePeriodSizeDay startingAt:[NSDate date]]; DTTimePeriod *timePeriod2 = [DTTimePeriod timePeriodWithSize:DTTimePeriodSizeDay endingAt:[NSDate date]]; NSLog(@"開始:%@ 結束:%@", [timePeriod1.StartDate formattedDateWithStyle:NSDateFormatterMediumStyle], [timePeriod1.EndDate formattedDateWithStyle:NSDateFormatterMediumStyle]); NSLog(@"開始:%@ 結束:%@", [timePeriod2.StartDate formattedDateWithStyle:NSDateFormatterMediumStyle], [timePeriod2.EndDate formattedDateWithStyle:NSDateFormatterMediumStyle]); //輸出: 開始:2016年5月24日 結束:2016年5月25日 //輸出: 開始:2016年5月23日 結束:2016年5月24日 /** * 時間段集合操做 */ //添加 [timePeriodCollection addTimePeriod:timePeriod1]; //插入 [timePeriodCollection insertTimePeriod:timePeriod2 atIndex:0]; //移除 [timePeriodCollection removeTimePeriodAtIndex:0]; /** * 時間段集合排序 */ //按開始時間升序 [timePeriodCollection sortByStartAscending]; //按開始時間降序 [timePeriodCollection sortByStartDescending]; //按結束時間升序 [timePeriodCollection sortByEndAscending]; //按結束時間降序 [timePeriodCollection sortByEndDescending]; //按持續時間升序 [timePeriodCollection sortByDurationAscending]; //按持續時間降序 [timePeriodCollection sortByDurationDescending]; //從時間段集合中獲取時間段 DTTimePeriod *firstTimePeriod = [timePeriodCollection objectAtIndexedSubscript:0];
獲取一個NSDate對象或一個DTTimePeriod對象與一個時間段集合的相對關係
一個緊密耦合的時間段集合
一般依據開始時間和結束時間存儲時間段對象
有本身的屬性,例如StartDate和EndDate屬性是根據內部時間段推測出來的
不容許存儲有重疊的時間段
//建立時間鏈 DTTimePeriodChain *chain = [DTTimePeriodChain chain]; //建立時間段 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat: @"YYYY MM dd HH:mm:ss.SSS"]; DTTimePeriod *firstPeriod = [DTTimePeriod timePeriodWithStartDate:[dateFormatter dateFromString:@"2014 11 05 18:15:12.000"] endDate:[dateFormatter dateFromString:@"2015 11 05 18:15:12.000"]]; DTTimePeriod *secondPeriod = [DTTimePeriod timePeriodWithStartDate:[dateFormatter dateFromString:@"2015 11 05 18:15:12.000"] endDate:[dateFormatter dateFromString:@"2016 11 05 18:15:12.000"]]; //添加 [chain addTimePeriod:firstPeriod]; [chain addTimePeriod:secondPeriod]; //插入 [chain insertTimePeriod:firstPeriod atInedx:0]; //移除 [chain removeTimePeriodAtIndex:0]; //移除最晚時間段 [chain removeLatestTimePeriod]; //移除最先時間段 [chain removeEarliestTimePeriod]; //獲取集合中的元素. firstPeriod = chain[0];
新加入的時間段,時長不變,起始時間變爲前一個時間段的結束時間,結束時間對應前移後後移.在非零位置新插入的時間,其後的時間段相應後移.在零位置插入的時間,集合的起始時間前移