简介
- NSDate 。在日期编程中,这个对象描述了日期和时间信息。可以把日期和时间看做是类中的普通属性,它不但用于日期,也用于时间处理。格式化,这个概念在直接处理 NSDate 对象时还用不到,只有在将日期对象转换为字符串对象时,才能用到格式化。
- NSDateComponents 。这个类可以简单的看做是 NSDate 的“姐妹”类,因为它为开发者带来了许多关于日期的便捷操作。其中一项重要内容是:它可以将日期和时间分割成独立的属性,这样就可以直接访问每项属性,这在诸如日期计算之类的任务中非常有用。 除了上面这些功能外, NSDateComponents 类在计算过去或未来的时间上也很有用。只需要简单的对某个子属性(年,月年等)执行加减操作,就可以算出未来或过去的一个时间。另外,NSDateComponents 类还适合查找两个日期之间的间隔。
- NSCalendar 。这个类的功能并不在本文的讨论范围,但是,NSDate 和 NSDateComponents 之间的互相转换,却是由 NSCalendar 类来控制的,因为需要制定某个 NSCalendar 对象,才能完成转换。事实上,系统在进行转换时,需要知道使用的日历(历法)是哪个,然后才能获得正确的转换结果。要知道,世界上有许多不同的日历,其年月日的值是各不相同的。
- NSDateFormatter 。这个类会帮助我们将 NSDate 对象转换为字符串对象,也可以将字符串对象转换为 NSDate 对象。通过它,可以将 NSDate 对象按照预定义的日期样式直接转换成字符串,也可以按自定义的日期格式进行转换。
NSDateFormatter 对象也支持本地化功能,只需要提供一个有效的 NSLocale 对象,就可以按照给定的locale设置转换成合适的字符串内容。 - NSDateComponentsFormatter 。它有一个重要目的:输入日期和时间,输出格式化好的可读字符串。它包含了许多方法来完成这个任务。
NSDate
|
|
NSDateFormatter
初始化
|
|
有两种方式可以设置格式:一种是通过一些预定义的日期格式化样式(dateStyle);另外一种是通过某些说明符来手动设置日期格式。stringFromDate 方法的使用也很重要,它是真正执行转换的代码。当谈到日期、字符串转换时,就指的是这个方法,而其他步骤只是起到定制结果的辅助作用。如果你在项目里要用到日期转换,这个方法会非常方便。
改变时区
|
|
自定义的日期格式
设置自定义日期格式在两种场景中很有用:
1.当预定义的日期样式不能满足我们的需求;2.当我们需要把一个复杂的日期字符串(比如Thu, 08 Oct 2015 09:22:33 GMT)转换成日期对象。要想设置合适的日期格式(对象),必须搭配使用一系列说明符。说明符也是简单的字符,但是对于date formatter来说有特定的含义。
|
|
NSDateComponents
NSDate到NSDateComponents
NSCalendar 的 components(_:fromDate:),这个方法接受两个参数:第二个是日期对象;第一个参数比较有意思,它接收若干个 NSCalendarUnit 类型值,NSCAlendarUnit 用来说明需要的日期部分。NSCalendarUnit 是一个结构体,你可以在 这个文档 中看到所有属性。这里需要注意:若某个组件没有在第一个参数中指定,就无法访问它。如:在这个例子中,我们没有指定 NSCalendarUnit.TimeZone,这样就无法访问时区的组件,比如print(dateComponents.timezone)调用会造成一个运行时错误。如果你需要额外的日期组件,只能重新调用一次calendar.Components方法,把你需要的Calendar Unit添加进去。
|
|
NSDateComponents到NSDate
初始化
这个过程中不需要使用calendar unit。只用初始化一个新的 NSDateComponents 对象,然后显式的设置你需要的组件的值,然后调用 NSCalendar 的 dateFromComponents 方法即可
改动时区对转换日期对象的影响
|
|
|
|
比较日期和时间
earlierDate:, 它用于判断一个日期是否早于另外一个日期。对应的还有一个是 laterDate:
NSDate 的 compare: 方法,它需要搭配使用 NSComparisonResult 枚举体。
时间间隔(time interval),查找到每个日期(到现在)的时间间隔,进行比对。
在下面的方法里,会看到“2000-01-01”的日期,这是因为若 NSDate 对象没有指定日期,只指定时间的话,会自动添加默认的日期属性。
计算未来和过去的日期
两种不同的方法:第一种使用 NSCalendar 类和 NSCalendarUnit 结构体;第二种使用 NSDateComponents 类。
假定我们需要为这个日期往后推两个月又5天。
这里用到的方法是 NSCAlendar 类的 dateByAddingUnit:value:toDate:options: 方法。它的作用是添加某个日历单元值(如年月日时分秒等)到现有的日期对象上,然后返回新的日期对象。我们需要添加两个日历单元到当前日期,直接用这个方法是不可能的(它每次只能设置一个calendar unit)。关键是调用两次这个方法,设置不同的日历单元,就能得到最终结果。
当日历单元多的时候,你就需要多次调用这个方法。在日历单元比较多的时候,更好的方法是使用 NSDateComponents 类。初始化一个 NSDateComponents 对象,并设置月份和天的信息。然后我们调用 NSCalendar 的另一个方法dateByAddingComponents:toDate:options:,并最终获得我们需要的日期对象。
// 注意:在以上调用 NSCalendar 方法的地方,最后一个参数options都没有被设置。如果你需要具体设置options的值,请参考完整的 官方文档。
计算日期间隔
通过date components来计算日期对象间隔。这个新方法叫 components:fromDate:toDate:options:,第一个参数是 NSCalendarUnit 值的数组。这里要注意,如果第一个日期如果晚于第二个日期,则结果会返回负值。
NSDateComponentsFormatter 类,它提供了多种用于自动计算日期间隔的方法,并可以返回格式化字符串结果。unitsStyle 属性指定我们使用的 dateComponentsFormatter 以何种格式打印日期的间隔。这里我们使用 完整 样式。
最后,在第三种计算的方法中,我们将两个日期传递给 NSDateComponentsFormatter 对象的一个叫 stringFromDate:toDate: 的方法。但是这个方法需要有个前置的条件:NSDateComponentsFormatter 的 allowedUnits 属性必须被提前设置,这个属性接受数组类型的值,这里至少要设置一个日历单元的值。否则这个方法会返回nil值。所以,在这个方法的使用中,我们“告诉”它需要获取哪些日历单元,它会按照对应的日历单元返回结果: