标签:date
应用中至少有两个日期,你想知道它们之间的关系。例如,某个日期是否在另一个日期之前?两个日期之间相差多少天?
解决方案
对于简单的比较来说,可以使用内置的NSDate比较函数。要想知道从某个日期开始经过了多少天,需要有指向系统日历的引用和两个日期。
说明
本攻略假定你使用5.2节中设置的iPhone发布日期,并将之与今天的日期进行比较。可以通过NSDate的date函数来获得今天的日期。
首先比较iPhone发布日期是否是今天,请使用isEqualToDate:函数并将需要比较的日期作为参数传递进来,该函数返回一个布尔值:
NSDate *todaysDate = [NSDate date];
if([todaysDate isEqualToDate:iPhoneReleaseDate])
NSLog(@"The iPhone was released today!");
else
NSLog(@"The iPhone was released on some other date");
要想判断某个日期是否早于另一个日期,请使用earlierDate:函数并将另一个日期作为参数传递进来,该函数返回更早的那个日期:
NSDate *earlierDateIs = [todaysDate earlierDate:iPhoneReleaseDate];
还可以进行相反比较,判断哪个日期更晚:
NSDate *laterDateIs = [todaysDate laterDate:iPhoneReleaseDate];
要想获得两个日期之间相差的秒数,请使用timeIntervalSinceDate:函数并将第二个日期作为参数传递进来。你会得到一个双精度浮点数,其值为两个日期间相差的秒数。这是个名为NSTimeInterval(你会发现其他的日期方法使用了NSTimeInterval)的typedef声明。
可以通过系统日历与NSDateComponents类获得关于日期比较的更详细信息,这会以你需要的格式返回两个日期间相差的时间。因此,如果想要知道天数、小时数、分钟数、年数、月数或是其中的组合,那么可以从中受益。
首先需要获得指向用户系统日历的引用:
NSCalendar *systemCalendar = [NSCalendar currentCalendar];
接下来,通过对NSCalendar常量进行按位或运算来指定采用的时间单位:
unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |
NSDayCalendarUnit;
注意:
位操作是处理底层二进制信息的一种方式。如你所知,计算机以一系列1和0来表示信息(比如00000011表示数字3)。位操作会比较两部分信息的二进制表示并根据比较得到结果。按位或表示如果两个信息中有一个为1,那么结果就为1。
换句话说,我想知道两个日期间相差的年数、月数与天数。表5-1列出了这里可以使用的常量。
可以通过NSCalendar的components:fromDate:toDate:options:函数来返回NSDateComponents对象,对象中的数据描述了根据指定的NSCalendar常量,计算得出的两个日期间的时间差:
NSDateComponents *dateComparisonComponents = [systemCalendar components:unitFlags
fromDate:iPhoneReleaseDate
toDate:todaysDate
options:NSWrapCalendarComponents];
可以访问相应的属性以获得所需的信息。例如,可以通过dateComparisonComponents.year属性获得年数。参见程序清单5-3。
标签:date
原文地址:http://5828666.blog.51cto.com/5818666/1621649