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

 

iOS 日历类(NSCalendar)的更多相关文章

  1. NSCalendar 日历类

    NSCalendar 日历类 Cocoa中对日期和时间的处理 NSCalendar (一) (2008-11-12 21:54:10) NSCalendar用于处理时间相关问题.比如比较时间前后.计算 ...

  2. IOS 公共类-MyDateUtil 日期处理Util

    IOS 公共类-MyDateUtil 日期处理Util 此为处理日期的公共类.适用IOS6+ .h文件: #import <Foundation/Foundation.h> //适用 IO ...

  3. NSCalenda日历类

    1. //将数据库时间和当前时间相比,得出时间差. + (NSString *)dateDescriptionWithDate:(NSDate *)date{ // NSCalendar日历类,提供了 ...

  4. IOS 公共类-MyMBProgressUtil Progress显示

    IOS 公共类-MyMBProgressUtil Progress显示 此公共类用于显示提示框,对MBProgress的进一步封装.可以看下面的代码 接口: @interface MyMBProgre ...

  5. 一位iOS教育类应用开发者是如何赚到60多万美元?

    注:伯乐在线12月19日在@程序员的那些事 微博推荐了此文的英文原文,非常感谢@dotSlash 的翻译.  转眼距我写<我如何在iOS教育类应用中赚到20万美元>这篇博文已经一年多了,它 ...

  6. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  7. 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化

    day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同.  equals 用于比较两个对象的内容是否相同   String,StringBuffer.StringBuilde ...

  8. java基础22 日期类、日历类、日期格式类

    package com.dhb.code; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

  9. PHP设计日历类一 (38)

    由两个文件组成: 第一个test.php <style> table { border:1px solid #; } .fontb { color:white; background:bl ...

随机推荐

  1. Java基础知识强化之多线程笔记04:并行和并发 区别

    1. 并发 和 并行区别 (1)并发:(单核) 并发,是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序. 并发是指两个任务都请求运行,而处理器只能按受 ...

  2. JS实现字符串去重,数组去重

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [Doc ID 433386.1]JSP Pages Hanging in R12 After Removing Cached Class Files in _pages

    In this Document   Symptoms   Changes   Cause   Solution   References Applies to: Oracle Application ...

  4. [Doc ID 1590988.1]如何清理E-Business Suite的缓存(Apache/iAS, Cabo, Modplsql, Browser, Jinitiator, Java, Portal, WebADI)?

    文档内容   目标   解决方案   参考 适用于: Oracle Applications Technology Stack - 版本 11.5.9 到 12.2.2 [发行版 11.5 到 12. ...

  5. nginx笔记---http配置

    1.三个逻辑区段 http:该区段嵌入配置文件的根部,在这个区段中允许定义指令和嵌入http相关模块.他包含了一个或多个server区段,他也能够使全局配置生效. server:这个区段建立了一个站点 ...

  6. CSS实现半透明的方法

    IE8不支持以前{filter:alpha(opacity=50);}的私有属性, 转而支持更规范的私有属性-ms-filter: “progid:DXImageTransform.Microsoft ...

  7. js 获取url中的查询字符串

    function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)( ...

  8. Linux Shell脚本编程--cut命令

    cut cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符 [root@www ...

  9. jsp(一) : servlet基础

    1.客户  servlet容器   servlet 2.实现接口     #1.接口:servlet :             constrontor .init().service.destroy ...

  10. extjs类的生命周期

    只要extjs对应的类文件加载了,那么该类就可以构造对象或者用来继承了.