Closed fengqingxiuyi closed 7 years ago
本文来自尚妆iOS团队嘉文 发表于尚妆博客
DateTools_下载
DateTools是Objective-C中简化日期和时间处理的工具.
CocoaPods pod 'DateTools'
pod 'DateTools'
手动安装 DataTools所需的所有类包含在DataTools文件夹下,如下:
DateTools.h
NSDate+DateTools.{h,m}
DTConstants.h
DTError.{h,m}
DTTimePeriod.{h,m}
DTTimePeriodGroup.{h,m}
DTTimePeriodCollection.{h,m}
DTTimePeriodChain.{h,m}
如果你的工程想要支持国际化或者使用"TimeAgo"功能必须要导入bundle文件 你可以在工程中Info下添加Localizations来添加支持的语言
DateTools.bundle
DateTools.h 包含了所有其他文件的头文件.在你的工程中导入DateTools.h头文件即可
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 方法)
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秒
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对象进行添加,插入,删除,不同之处在于如何处理时间段
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];
新加入的时间段,时长不变,起始时间变为前一个时间段的结束时间,结束时间对应前移后后移.在非零位置新插入的时间,其后的时间段相应后移.在零位置插入的时间,集合的起始时间前移
DateTools使用「日期工具库」
准备:
DateTools_下载
DateTools是Objective-C中简化日期和时间处理的工具.
安装
CocoaPods
pod 'DateTools'
手动安装 DataTools所需的所有类包含在DataTools文件夹下,如下:
DateTools.h
NSDate+DateTools.{h,m}
DTConstants.h
DTError.{h,m}
DTTimePeriod.{h,m}
DTTimePeriodGroup.{h,m}
DTTimePeriodCollection.{h,m}
DTTimePeriodChain.{h,m}
如果你的工程想要支持国际化或者使用"TimeAgo"功能必须要导入bundle文件 你可以在工程中Info下添加Localizations来添加支持的语言
DateTools.bundle
DateTools.h
包含了所有其他文件的头文件.在你的工程中导入DateTools.h头文件即可DateTools中包含3个子库
基本使用
NSDate+DateTools
1.Time Ago(相对日期形式)
2.Date Components(日期组成部分)
3.日期编辑
4.日期比较
5.格式化日期字符串
Time Periods「时间段」
初始化和获取时间段信息
时间段操作
时间段关系
>两个时间段关系相关方法:
Time Period Groups「时间段组」
DTTimePeriodCollection (时间段集合)
>一个规则相对宽松的时间段集合 默认是无序的,但是支持通过调用方法排序 有自己的属性,例如StartDate和EndDate属性是根据内部时间段推测出来的 允许存储有重叠的时间段
DTTimePeriodChain (时间链)