【iOS开源代码】(3):DateTools

一、介绍

DateTools 是一个用于处理日期和时间的 O-C 库。它包含 3 个子库:

NSDate+DateTools、Time Periods、Time Periods Group。

1、NSDate+DateTools

不知道你们是否有这种感觉,O-C 提供的 NSDate 似乎和其他语言的日期类不太一样,它更像是由 timeIntervalSince... 方法构造的 Unix 时间,另外在加上一个日历功能。但有时候我们更希望以日期组件“年、月、日”的方式来访问日期。这就是 NSDate+DateTools 要为我们提供的。它主要提供了一下几个功能。

1) Time ago

这部分实际上是Kevin Lawler 写的 NSDate+TimeAgo 库,现在已被正式纳入到 DateTools 库中。

顾名思义,Time ago 就是将日期转变为相对日期的形式,即我们常用的“昨天、今天、明天、几天前,一周以后……”这样的表述方式。它有“长、短”两种格式,后者是前者的更简短的描述。例如:

NSDate *timeAgoDate = [NSDatedateWithTimeIntervalSinceNow:-4];

NSLog(@"Time Ago: %@",timeAgoDate.timeAgoSinceNow);

NSLog(@"Time Ago: %@",timeAgoDate.shortTimeAgoSinceNow);

以上代码分别输出:

Time Ago: 4 seconds ago

Time Ago: 4s

当然,DateTools 提供了多达33种语言的支持,当然也包括简体/繁体中文。

2) 访问日期组件

以前,我们要读取一个 NSDate 的年月日,必须这样做:

//Create calendar

NSCalendar *calendar =[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

unitFlags = NSYearCalendarUnit |NSMonthCalendarUnit;

NSDateComponents *dateComponents= [calendar components:unitFlags fromDate:date];

//Get components

NSInteger year =dateComponents.year;

NSInteger month =dateComponents.month;

但是,使用 DateTools,只需要:

NSInteger year = date.year;

NSInteger month = date.month;

如果采用了非格鲁吉亚日历,只需这样:

NSInteger day = [datedayWithCalendar:calendar];

还可以将整个 DateTools 默认的日历由格鲁吉亚日历修改为其它,则可以修改 NSDate+DateTools.m文件中的 defaultCalendar 方法。

3) 日期的运算

以前,要想将既有日期上加/减一年形成新的日期,我们必须:

//Create calendar

NSCalendar *calendar =[[NSCalendar alloc] initWithCalendarIdentifier:[NSDate defaultCalendar]];

NSDateComponents *components =[[NSDateComponents alloc] init];

//Make changes

[components setYear:1];

//Get new date with updated year

NSDate *newDate = [calendardateByAddingComponents:components toDate:date options:0];

使用 DateTools 则可以用:

NSDate *newDate = [datedateByAddingYears:1];

如果是减去一年,则可以用dateBySubtractingYears 方法。

4) 比较运算

NSDate 有 4 种基本的比较运算:

isEqualToDate:

earlierDate:

laterDate:

compare:

DateTools 则将它们改成了:

isEarlierThan

isEarlierThanOrEqualTo

isLaterThan

isLaterThanOrEqualTo

除此之外,DateTools 还提供了更多的操作:

·     yearsFrom:, yearsUntil, yearsAgo, yearsEarlierThan:,yearsLaterThan:

·     monthsFrom:, monthsUntil, monthsAgo,monthsEarlierThan:, monthsLaterThan:

·     weeksFrom:, weeksUntil, weeksAgo, weeksEarlierThan:,weeksLaterThan:

·     daysFrom:, daysUntil, daysAgo, daysEarlierThan:,daysLaterThan:

·     hoursFrom:, hoursUntil, hoursAgo, hoursEarlierThan:,hoursLaterThan:

·     minutesFrom:, minutesUntil, minutesAgo,minutesEarlierThan:, minutesLaterThan:

·     secondsFrom:, secondsUntil, secondsAgo,secondsEarlierThan:, secondsLaterThan:

这样,你可以很轻易地知道两个日期相差有多少年/月/日:

NSInteger yearsApart =[firstDate yearsFrom:secondDate];

5) 格式化日期字串

DateTools 简化了格式化日期字串的操作,即formattedDateWithStyle:和formattedDateWithFormat: 方法。

2、时段

时段即时间段,包括一段连续的时间,DateTools 使用 DTTimePeriod 来表示。 DTTimePeriod 类包括一系列初始化方法、以及关于时段的运算和比较操作。

1) 创建

时段的创建(初始化方法)有两种。

时段包括一个起始时间和一个结束时间。这也体现在它的初始化方法中:

DTTimePeriod *timePeriod =[[DTTimePeriod alloc] initWithStartDate:startDate endDate:endDate];

当然,你也可以不指定结束时间,结束时间可以由开始时间和时段的长度得到。例如下面的时段由开始时间和长度为5个小时的时长来描述:

DTTimePeriod *timePeriod =[DTTimePeriod timePeriodWithSize:DTTimePeriodSizeHour amount:5startingAt:[NSDate date]];

2) 时段的属性

·     hasStartDate - 如果该时段拥有开始时间,返回 Yes

·     hasEndDate - 如果该时段拥有结束时间,返回 Yes

·     isMoment - 如果时段的开始时间等于结束时间,返回 Yes

·     durationIn.... - 以指定的单位返回时长。

3) 运算

时段支持3种运算:移动、增加时长、减少时长。

移动是将时段开始时间提前或后延的操作。使用方法shiftEarlierWithSize:amount:和shiftLaterWithSize:amount: 进行。

增加时长或减少时长可以分为两种情况。一种是固定开始时间,然后增加/减少时长,最终会改变结束时间;一种是固定结束时间,然后增加/减少时长,最终会改变开始时间。例如:

DTTimePeriod *timePeriod  = [DTTimePeriodtimePeriodWithSize:DTTimePeriodSizeMinute endingAt:[NSDate date]];

[timePeriodlengthenWithAnchorDate:DTTimePeriodAnchorEnd size:DTTimePeriodSizeMinuteamount:1];

上述代码将时长由1分钟增加为2分钟,固定结束时间,因此开始时间被提前了1分钟。

4) 关系运算

对于两个时段,我们经常会这样考虑二者的关系:它们是否是相同的?是否一个在另一个的范围之内?

DTTimePeriod 支持5种基本的关系运算:

isEqualToPeriod: 相等

isInside: 被包含

contains: 包含

overlapsWith:重叠,部分相同

intersects:相交,在重叠的基础上再增加两种情况:前者结束时间=后者开始时间,前者开始时间=后者结束时间。

3、时段组

即时段集合,包括两个类:DTTimePeriodCollection和DTTimePeriodChain。二者的最大不同,是后者不允许集合中时段有重叠。

时间: 2024-10-14 06:56:40

【iOS开源代码】(3):DateTools的相关文章

ios 开源代码

1.开源代码 http://www.oschina.net/iOS/codingList/365/ios-button http://www.devdiv.com/iOS_iPhone-iOS6%E6%96%B0%E7%89%B9%E5%BE%81%EF%BC%9A%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99%E5%92%8C%E7%A4%BA%E4%BE%8B%E6%B1%87%E6%80%BB-thread-127965-1-1.html http://code4

【iOS开源代码】(5):MKNetworkKit

ASIHTTPRequest (作者:BenCopsey) 是一个使用简单,可用于各种从简单到复杂的 HTTP 请求,或者可用于处理 Amazon S3.Rackspace 等 REST 服务的强大框架. 不幸的是,Ben 早在2011 年 9 月 21 日就已经声明停止开发和支持该框架(见http://allseeing-i.com/%5Brequest_release%5D; ). Ben 推荐了许多可替代的框架(比如AFNetworking, RestKit 或 LRResty).但最有潜

【iOS开源代码】(2):CKEditor

CKEditor 是当前最为知名的 HTML 编辑器,它具有所有主流 HTML 编辑器所应当具备的特点:所见即所得.简单易用.开源并支持各种主流的浏览器(IE.Oper.FireFox.Chrome.Safari).最重要的是,CKEditor 经过 10 年的不断完善和更新,其稳定性和兼容性已经不容质疑. 一.下载 CKEditor 最新版本当前为 4.3.进入 CKEditor 的下载页面(http://ckeditor.com/download),你会看到 4.3 版本又分为3个版本:基本

【iOS开源代码】(1):CCLHTTPServer

我从没有见过比 CCLHTTPServer 更简单的 iOS HTTP 服务器了.你甚至不用创建任何子类即可使用它.对于大部分任务,这个小巧但强悍的服务器能够满足你的需要. 它简单到令人发指,因此我认为光看它的主页介绍就已经足够了: https://github.com/cocodelabs/CCLHTTPServer CCLHTTPServer 是一个 iOS/OSX 下的简单HTTP 服务器框架. 一.用法 以下代码创建了一个简单的 HTTP 服务器,监听指定端口,并用指定的 CCLHTTP

【iOS开源代码】(4):FPPopover

原文:https://github.com/50pixels/FPPopover   这个框架完全可用于取代苹果的 UIPoverController,因为它不仅支持 iPad,还支持 iPhone.此外,你还可以在 iPhone 中定制它的外观和样式. 本项目原本是 Mobiloud 上的一个开源组件,在我意识到它的价值之后,我决定继续跟进这个项目.欢迎你给我留言或者通过 pull request 共享你的代码. 功能 类似 UIPopoverController . 同时支持 iPhone

iOS流行的开源代码库

本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/AFNetworking/AFNetworking 2.GPUImage 图像处理库,基于OpenGL ES,图像处理效率高.https://github.com/BradLarson/GPUImage 3.Masonry 自动布局库.https://github.com/SnapKit/Mason

CocoaPods的使用(管理iOS项目中第三方开源代码)

CocoaPods是一个负责管理iOS项目中第三方开源代码的工具.可以节省设置和更新第三方开源库的时间,提高工作效率. 下面是CocoaPods的使用步骤,强烈建议在家里的网络做以下操作,公司的网太慢了,除非你觉得很快!! 1.打开终端 sudo gem install cocoapods 命令解释:用gem安装cocoapods工具包 输入这行命令后,会让你输入电脑密码 接下来就是一大堆安装操作,耐心等待. 然后会出现下面的情况 Installing ri documentation for

GitHub上史上最全的iOS开源项目分类汇总

学了这么久,还是抽时间把github上比较好用的第三方总结了一下: Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错-       BFKit 又一套Category类型的 Kit,还有几个工具类       APUtils 又一套Category类型的 Kit       QSKit 又一套Category类型的 Kit       iOS-Categories 又一套Category类型的 Kit       BlocksKit 将B

GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式. 对于Android 4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice Cream Sandwich的自定义动作栏实现将自动围绕布局.能够让开发者轻松开发