DateTools使用「日期工具庫」

DateTools

1、準備

DateTools_下載git

DateTools

DateTools是Objective-C中簡化日期和時間處理的工具.github

2、安裝


CocoaPods
pod 'DateTools'objective-c

手動安裝
DataTools所需的全部類包含在DataTools文件夾下,以下:數組

  • DateTools.hide

  • NSDate+DateTools.{h,m}工具

  • DTConstants.hspa

  • 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頭文件便可

DateTools中包含3個子庫

  • NSDate+DateTools

  • Time Periods

  • Time Period Groups

3、基本使用

NSDate+DateTools

1.Time Ago(相對日期形式)

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下相應的文件
下圖以簡體中文爲例:

修改相對日期顯示文字

2.Date Components(日期組成部分)

獲取日期的組成部分:

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

3.日期編輯

對日期進行編輯(年,月,日,星期,時,分,秒)

增長/減小方法:

日期編輯

/**
  *  日期增長1年
  */
NSDate *date = [NSDate date];
NSDate *newDate = [date dateByAddingYears:1];
 
NSLog(@"year:%ld newYear:%ld", date.year, newDate.year);
//輸出: year:2016 newYear:2017

4.日期比較

比較兩個日期大小返回一個布爾值:

日期比較

更多日期比較方法:

(很容易的獲得兩個日期相差的年,月,星期,日,時,分,秒)

更多日期比較方法

5.格式化日期字符串

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   毫秒                                      

Time Periods「時間段」

DateTools提供DTTimePeriod來簡化時間段的操做

1.初始化和獲取時間段信息

/**
  *  經過起始時間來初始化時間段
  */
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秒

更多初始化時間段方法:

更多初始化時間段方法

2.時間段操做

移動時間段:
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天

3.時間段關係

兩個時間段關係相關方法:

時間段關係方法

兩個時間段關係全部可能性:

時間段關係可能性

時間段關係枚舉DTTimePeriodRelation:

/**
  *  DTTimePeriodRelation時間段關係枚舉
  */
typedef NS_ENUM(NSUInteger, DTTimePeriodRelation){
    DTTimePeriodRelationAfter,      
    DTTimePeriodRelationStartTouching,    
    DTTimePeriodRelationStartInside,
    DTTimePeriodRelationInsideStartTouching,
    DTTimePeriodRelationEnclosingStartTouching,
    DTTimePeriodRelationEnclosing,
    DTTimePeriodRelationEnclosingEndTouching,
    DTTimePeriodRelationExactMatch,
    DTTimePeriodRelationInside,
    DTTimePeriodRelationInsideEndTouching,
    DTTimePeriodRelationEndInside,
    DTTimePeriodRelationEndTouching,
    DTTimePeriodRelationBefore,
    DTTimePeriodRelationNone      
};

Time Period Groups「時間段組」

DateTools提供兩種時間段組類:
DTTimePeriodCollection     時間段集合 (容許存儲彼此有交集的時間段)
DTTimePeriodChain    時間段連接 (不容許存儲彼此有交集的時間段)

DTTimePeriodCollection和DTTimePeriodChain就像NSArray同樣,你能夠像操做數組同樣對它們中的DTTimePeriod對象進行添加,插入,刪除,不一樣之處在於如何處理時間段

1.DTTimePeriodCollection (時間段集合)

一個規則相對寬鬆的時間段集合
默認是無序的,可是支持經過調用方法排序
有本身的屬性,例如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對象與一個時間段集合的相對關係

時間段集合操做方法

2.DTTimePeriodChain (時間鏈)

一個緊密耦合的時間段集合
一般依據開始時間和結束時間存儲時間段對象
有本身的屬性,例如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];

新加入的時間段,時長不變,起始時間變爲前一個時間段的結束時間,結束時間對應前移後後移.在非零位置新插入的時間,其後的時間段相應後移.在零位置插入的時間,集合的起始時間前移

時間鏈操做示意圖

相關文章
相關標籤/搜索