对于时间的操作在开发中很常见,但有时候我们需要获取到一年后的时间,或者一周后的时间.靠通过秒数计算是不行的.那就牵扯到另外一个日历类(NSCalendar).
下面先简单看一下 NSDate
let date = NSDate()
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH-mm-ss"
formatter.stringFromDate(date)// 延迟多少秒为正数 前多少秒为负数let
date2 = date.dateByAddingTimeInterval(500)
formatter.stringFromDate(date2)// 返回两个时间较早的时间
let earlierDate = date.earlierDate(date2)// 返回较晚的时间
let laterDate = date.laterDate(date2)
通过上面我们发现计算两天之间的差我们可以推迟3600 *24,一个月呢,有时候30天,有时候31天.那就难以计算了.
下面看看如何使用 NSCalendar.
// 日历获取在9.x之后的系统使用currentCalendar会出异常。在8.0之后使用系统新API。
//let calendar = NSCalendar.currentCalendar()
// 需要传的是一个字符串, 因为日历可以有很多种 这里选择的是公历let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) // 8.0以后的新方法 /*
日历的类型
@available(iOS, introduced=2.0, deprecated=8.0, message="Use NSCalendarIdentifierGregorian instead")
public let NSGregorianCalendar: String // 公历
@available(iOS, introduced=2.0, deprecated=8.0, message="Use NSCalendarIdentifierBuddhist instead")
public let NSBuddhistCalendar: String // 佛历
@available(iOS, introduced=2.0, deprecated=8.0, message="Use NSCalendarIdentifierChinese instead")
public let NSChineseCalendar: String // 农历
@available(iOS, introduced=2.0, deprecated=8.0, message="Use NSCalendarIdentifierHebrew instead")
public let NSHebrewCalendar: String // 希伯来日历
@available(iOS, introduced=2.0, deprecated=8.0, message="Use NSCalendarIdentifierIslamic instead")
public let NSIslamicCalendar: String // 伊斯兰日历
@available(iOS, introduced=2.0, deprecated=8.0, message="Use NSCalendarIdentifierIslamicCivil instead")
public let NSIslamicCivilCalendar: String // 伊斯兰民事日历
@available(iOS, introduced=2.0, deprecated=8.0, message="Use NSCalendarIdentifierJapanese instead")
public let NSJapaneseCalendar: String // 日本日历
@available(iOS, introduced=4.0, deprecated=8.0, message="Use NSCalendarIdentifierRepublicOfChina instead")
public let NSRepublicOfChinaCalendar: String // 中国日历
@available(iOS, introduced=4.0, deprecated=8.0, message="Use NSCalendarIdentifierPersian instead")
public let NSPersianCalendar: String // 波斯日历
@available(iOS, introduced=4.0, deprecated=8.0, message="Use NSCalendarIdentifierIndian instead")
public let NSIndianCalendar: String // 印度日历
@available(iOS, introduced=4.0, deprecated=8.0, message="Use NSCalendarIdentifierISO8601 instead")
public let NSISO8601Calendar: String // 国际标准化组织的国际标准日历
*/
有了日历的类我们就方便操作了,这里提供两种方法,
方法一:
// 日期比较的类
let adcomps = NSDateComponents()
adcomps.year = 1adcomps.month = -1adcomps.day = 1// 追加时间可以一次性设置多值
let date5 = calendar?.dateByAddingComponents(adcomps, toDate: date, options: .WrapComponents)
formatter.stringFromDate(date5!)
注意:
-
.WrapComponents无法进位的.也就是说满一月月份不会加1,而是 Day 循环.什么意思呢.
比如今天是2016-07-07.只是设置adcomps.day = 24.那么得到的结果是2016-07-31;
那么如果设置adcomps.day = 25呢,得到的结果不是2016-08-01,而是2016-07-01.也就是做 day 在循环,对于month的设置 效果是一样的.
如果要进位使用其他的可选值
在 OC 中直接设置 option 的值为0即可;
方法二:
let date6 = calendar?.dateByAddingUnit(.Year, value: 1, toDate: date, options: .WrapComponents)
相关传送门给大家
https://www.cnblogs.com/isItOk/p/4873051.html
https://www.cnblogs.com/isItOk/p/4619854.html
https://www.jianshu.com/p/e0634fb2a6d2