iOS 日历类(NSCalendar)

对于时间的操作在开发中很常见,但有时候我们需要获取到一年后的时间,或者一周后的时间.靠通过秒数计算是不行的.那就牵扯到另外一个日历类(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

 

 

posted on 2016-08-09 23:21  🌞Bob  阅读(1833)  评论(0编辑  收藏  举报

导航