zoukankan      html  css  js  c++  java
  • 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

     
  • 相关阅读:
    【POJ】1067 取石子游戏(博弈论)
    【POJ】2348 Euclid's Game(扩欧)
    【POJ】1061 青蛙的约会 / 【BZOJ】1477(扩欧)
    【POJ】3090 Visible Lattice Points(欧拉函数)
    【BZOJ】2190 [SDOI2008]仪仗队(欧拉函数)
    【POJ】2115 C Looooops(扩欧)
    【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)
    [BZOJ4822][Cqoi2017]老C的任务
    [BZOJ1001][BeiJing2006]狼抓兔子
    [BZOJ1188][HNOI2007]分裂游戏
  • 原文地址:https://www.cnblogs.com/isItOk/p/5755019.html
Copyright © 2011-2022 走看看