前言

  • NSDate

    	@interface NSDate : NSObject <NSCopying, NSSecureCoding>
    • NSDate 用来表示公历的 GMT 时间(格林威治时间)。是独立与任何历法的,它只是时间相对于某个时间点的时间差;NSDate 是进行日历计算的基础。
  • NSDateComponents

    	@interface NSDateComponents : NSObject <NSCopying, NSSecureCoding>
    • NSDateComponents 封装了具体年月日、时秒分、周、季度等。将时间表示成适合人类阅读和使用的方式,通过 NSDateComponents 可以快速而简单地获取某个时间点对应的“年”,“月”,“日”,“时”,“分”,“秒”,“周”等信息。当然一旦涉及了年月日时分秒就要和某个历法绑定,因此 NSDateComponents 必须和 NSCalendar 一起使用,默认为公历。NSDateComponents 除了像上面说的表示一个时间点外,还可以表示时间段,例如:两周,三个月,20年,7天,10分钟,50秒等等。时间段用于日历的计算,例如:获取当前历法下,三个月前的某个时间点。可以说,要获取某个时间点在某个历法下的表示,需要 NSDateComponents; 要计算当前时间点在某个历法下对应的一个时间段前或后的时间点,需要 NSDateComponents。NSDateComponents 返回的 day, week, weekday, month, year 这一类数据都是从 1 开始的。因为日历是给人看的,不是给计算机看的,从 0 开始就是个错误。
  • NSDateFormatter

    	@interface NSDateFormatter : NSFormatter
    • NSDateFomatter 表示的时间默认以公历(即阳历)为参考,可以通过设置 calendar 属性变量获得特定历法下的时间表示。

1、NSDate 的创建

	// 对象方法

		// 当前时间值,GMT 时间
NSDate *date1 = [[NSDate alloc] init]; // 当前时间加 n 秒后的值
NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:10]; // 某个时间增加 n 秒后的值
NSDate *date3 = [[NSDate alloc] initWithTimeInterval:10 sinceDate:date2]; // 从 1970-01-01 00:00:00 (GMT) 增加 n 秒后的值
NSDate *date4 = [[NSDate alloc] initWithTimeIntervalSince1970:3600]; // 从 2001-01-01 00:00:00 (GMT) 增加 n 秒后的值
NSDate *date5 = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:10]; // 类方法 // 当前时间值,GMT 时间
NSDate *date6 = [NSDate date]; // 当前时间加 n 秒后的值
NSDate *date7 = [NSDate dateWithTimeIntervalSinceNow:10]; // 某个时间增加 n 秒后的值
NSDate *date8 = [NSDate dateWithTimeInterval:10 sinceDate:date2]; // 从 1970-01-01 00:00:00 (GMT) 增加 n 秒后的值
NSDate *date9 = [NSDate dateWithTimeIntervalSince1970:3600]; // 从 2001-01-01 00:00:00 (GMT) 增加 n 秒后的值
NSDate *date10 = [NSDate dateWithTimeIntervalSinceReferenceDate:10]; // 未来某一个随机时间
NSDate *date11 = [NSDate distantFuture]; // 过去某一个随机时间
NSDate *date12 = [NSDate distantPast]; // 指定时间间隔
/*
某个时间增加 n 秒后的值
*/
NSDate *date13 = [date6 dateByAddingTimeInterval:20];

2、NSDate 时间间隔的计算

	NSDate *date1 = [NSDate date];
NSDate *date2 = [date1 dateByAddingTimeInterval:20]; // 实例保存的时间 与 当前时间 的时间间隔,单位 秒
NSTimeInterval interval1 = [date2 timeIntervalSinceNow]; // 实例保存的时间 与 指定时间 的时间间隔,单位 秒
NSTimeInterval interval2 = [date2 timeIntervalSinceDate:date1]; // 实例保存的时间 与 1970-01-01 00:00:00 (GMT) 的时间间隔,单位 秒
NSTimeInterval interval3 = [date1 timeIntervalSince1970]; // 实例保存的时间 与 2001-01-01 00:00:00 (GMT) 的时间间隔,单位 秒
NSTimeInterval interval4 = [date1 timeIntervalSinceReferenceDate]; // 当前时间 与 2001-01-01 00:00:00 (GMT) 的时间间隔,单位 秒
NSTimeInterval interval5 = [NSDate timeIntervalSinceReferenceDate];

3、NSDate 时间的比较

	NSDate *date1 = [NSDate date];
NSDate *date2 = [date1 dateByAddingTimeInterval:10]; // isEqualToDate // 判断两个时间是否相等
BOOL bl = [date1 isEqualToDate:date2]; // compare // 比较两个时间大小
NSComparisonResult result = [date1 compare:date2]; // earlierDate // 比较两个时间,返回 较早的时间
NSDate *date3 = [date1 earlierDate:date2]; // laterDate // 比较两个时间,返回 较晚的时间
NSDate *date4 = [date1 laterDate:date2];

4、NSDateComponents 的创建

	// 由手动设置创建
NSDateComponents *compt1 = [[NSDateComponents alloc] init]; // 日历
[compt1 setCalendar:[NSCalendar currentCalendar]]; // 时区
[compt1 setTimeZone:[NSTimeZone systemTimeZone]]; // 纪元
[compt1 setEra:1]; // 年
[compt1 setYear:2016]; // 月
[compt1 setMonth:3]; // 日
[compt1 setDay:1]; // 时
[compt1 setHour:00]; // 分
[compt1 setMinute:10]; // 秒
[compt1 setSecond:55]; // 微妙
[compt1 setNanosecond:280]; // 刻钟
[compt1 setQuarter:0]; // 周几
[compt1 setWeekday:3]; // 指定日期为本月的第几个星期几
[compt1 setWeekdayOrdinal:1]; // 指定日期为本月的第几周
[compt1 setWeekOfMonth:1]; // 指定日期为本年的第几周
[compt1 setWeekOfYear:10]; //
[compt1 setYearForWeekOfYear:2016]; // 由已知 date 创建
/*
只有明确指定了 unitFlags,NSDateComponents 相应的那一部分才有值
*/
NSDateComponents *compt2 = [[NSCalendar currentCalendar] components:NSCalendarUnitEra
| NSCalendarUnitYear
| NSCalendarUnitMonth
| NSCalendarUnitDay
| NSCalendarUnitHour
| NSCalendarUnitMinute
| NSCalendarUnitSecond
| NSCalendarUnitNanosecond
| NSCalendarUnitQuarter
| NSCalendarUnitWeekday
| NSCalendarUnitWeekdayOrdinal
| NSCalendarUnitWeekOfMonth
| NSCalendarUnitWeekOfYear
| NSCalendarUnitYearForWeekOfYear
| NSCalendarUnitCalendar
| NSCalendarUnitTimeZone fromDate:[NSDate date]];

5、NSDateComponents 时间间隔的计算

	NSDate *date1 = [NSDate date];
NSDate *date2 = [NSDate dateWithTimeInterval:5*60*60+75 sinceDate:date1]; NSDateComponents *compt = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute
| NSCalendarUnitSecond
fromDate:date1
toDate:date2
options:0];

6、NSDateComponents 与 NSDate 的相互转换

	NSCalendar *calendar = [NSCalendar currentCalendar];

	// NSDate 转 NSDateComponents

		NSDateComponents *compt = [calendar components:NSCalendarUnitYear
| NSCalendarUnitMonth
| NSCalendarUnitDay
fromDate:[NSDate date]]; // NSDateComponents 转 NSDate // 转换时间时,使用默认的时区 GMT 时区
NSDate *date = [calendar dateFromComponents:compt]; // 得到本地时间,避免时区问题
date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];

7、NSDateComponents 与 NSDate 的计算

	NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setDay:25];
[compt setHour:4];
[compt setMinute:66]; // NSDate 加上 NSDateComponents 表示的一段时间
NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:compt toDate:[NSDate date] options:0]; // 得到本地时间,避免时区问题
date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];

8、NSDateFormatter 的时间格式化

	G -- 纪元				     一般会显示公元前(BC)和公元(AD)
y -- 年 假如是2013年,那么 yyyy=2013,yy=13
M -- 月 假如是3月,那么 M=3,MM=03,MMM=Mar,MMMM=March;假如是11月,那么M=11,MM=11,
MMM=Nov,MMMM=November
w -- 一年中的第几周 假如是1月8日,那么 w=2(这一年的第二个周)
W -- 一个月中的第几周 与日历排列有关,假如是2013年4月21日,那么 W=4(这个月的第四个周)
F -- 月份包含的周 与日历排列无关,和上面的 W 不一样,F 只是单纯以7天为一个单位来统计周,例如7号一定是第一个周,
15号一定是第三个周,与日历排列无关。
D -- 一年中的第几天 假如是1月20日,那么 D=20(这一年的第20天);假如是2月25日,那么 D=31+25=56(这一年的第56天)
d -- 一个月中的第几天 假如是5号,那么 d=5,dd=05 假如是15号,那么 d=15,dd=15
E -- 星期几 假如是星期五,那么 E=Fri,EEEE=Friday
a -- 上午(AM)/下午(PM)
H -- 24小时制 显示为0--23,假如是午夜00:40,那么 H=0:40,HH=00:40
h -- 12小时制 显示为1--12,假如是午夜00:40,那么 h=12:40
K -- 12小时制 显示为0--11,假如是午夜00:40,那么 K=0:40,KK=00:40
k -- 24小时制 显示为1--24,假如是午夜00:40,那么 k=24:40
m -- 分钟 假如是5分钟,那么 m=5,mm=05;假如是45分钟,那么 m=45,mm=45
s -- 秒 假如是5秒钟,那么 s=5,ss=05;假如是45秒钟,那么 s=45,ss=45
S -- 毫秒 一般用 SSS 来显示
z -- 时区 表现形式为 GMT+08:00
Z -- 时区 表现形式为 +0800 // 使用 NSDateFormatter 转换时间字符串时,默认的时区是系统时区,例如在中国一般都是北京时间(+8),
// 如果直接转换会导致结果相差8小时,所以一般的做法是先指定时区为GMT标准时间再转换。 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 设置时区,不设置时默认的时区是系统时区(GMT+8)
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; // 设置日期格式,以字符串表示的日期形式的格式
[formatter setDateFormat:@"G yyyy-MM-dd E D F w W a z HH:mm:ss.SSS"]; // 格式化日期,GMT 时间,NSDate 转 NSString
NSString *str = [formatter stringFromDate:[NSDate date]];

9、1437494603 (秒) 格式 转 YYYY-MM-dd HH:mm:ss 格式

	// 计算日期
NSDate *date = [NSDate dateWithTimeIntervalSince1970:1437494603]; // 创建时间戳
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 设置日期格式,以字符串表示的日期形式的格式
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; // 转换成指定的格式
NSString *string = [formatter stringFromDate:date];

10、NSDate 与 NSString 的相互转换

	NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

	// 设置时区 GMT
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; // 加入一些别的英文字符串时,需用单引号来引入
[formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒 'iOS Date Test'"]; // NSString 转 NSDate
NSDate *date = [formatter dateFromString:@"2016年01月12日 1点8分50秒"]; // NSDate 转 NSString
NSString *str = [formatter stringFromDate:date];

11、时区差值转换

	// 得到当前时间(世界标准时间 UTC/GMT)
NSDate *date = [NSDate date]; // 设置系统时区为本地时区
NSTimeZone *zone = [NSTimeZone systemTimeZone]; // 计算本地时区与 GMT 时区的时间差
NSInteger interval = [zone secondsFromGMT]; // 在 GMT 时间基础上追加时间差值,得到本地时间
date = [date dateByAddingTimeInterval:interval];

iOS - OC NSDate 时间的更多相关文章

  1. iOS - Swift NSDate 时间

    前言 NSDate public class NSDate : NSObject, NSCopying, NSSecureCoding NSDate 用来表示公历的 GMT 时间(格林威治时间).是独 ...

  2. iOS:NSDate的主要几种时间形式

    NSDate:时间的获取和操作 1.获取当前时间 //获取当前日期 NSDate *date = sender.date; NSLog(@"%@",date); 2.将date转换 ...

  3. ios开发之--时间格式化

    字符串转时间 iOS 中 NSDate 是时间管理类,这里获取到的时间是 UTC 时间,可以根据需要转换成任意地区的时间. NSFormatter 类是时间格式化类,可以根据指定的格式.地区将指定的时 ...

  4. iOS OC语言原生开发的IM模块--RChat

    iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...

  5. iOS 获取当前时间格式化字符串

    iOS 获取当前时间格式化字符串 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保 ...

  6. Swift3.0 iOS获取当前时间 - 年月日时分秒星期

    Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...

  7. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  8. c time_t 和 oc NSDate 的转换

    c time_t 和 oc NSDate 的转换 1:time_t 转 oc NSDate time_t some_time_t=NULL; NSDate *someDate = [NSDate da ...

  9. NSdate 时间格式

    NSdate 时间格式 NSTimeInterval 时间间隔 基本单位 秒 NSDateFormatter 时间格式器 用于日期对象的格式化或字符串解析为日期对象 日期格式如下: y  年 M  年 ...

随机推荐

  1. redis 多数据库

    一台服务器上都快开启200个redis实例了,看着就崩溃了.这么做无非就是想让不同类型的数据属于不同的应用程序而彼此分开. 那么,redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的 ...

  2. 使用163CentOS镜像

    CentOS镜像使用帮助 收录架构 i386 x86_64 SRPMS 收录版本 5 6 更新时间 每5小时更新一次   使用说明 首先备份/etc/yum.repos.d/CentOS-Base.r ...

  3. php 的 构造函数 和 析构函数

    构造函数 在C++ java里的应用及其普遍,今天好好研究了一下 php 的 构造函数 和 析构函数 构造函数 和 析构函数 构造函数 void __construct ([ mixed $args ...

  4. SQL编程之高级查询(子查询)以及注意事项

    SQL编程之高级查询(子查询)以及注意事项   1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命 ...

  5. sharepoint 开发

    1. 客户端界面搜索 <div> 业务员:<).match(reg); ]);return null; } function search() { var k=document.ge ...

  6. 关于hibernate对应关系之后取值的问题

    hibernate对应关系之后取值,比如一对一关系,取不到值,需要检查PO类中是否生成了getter及setter方法.

  7. YTU 2991: 链表节点逆置(线性表)

    2991: 链表节点逆置(线性表) 时间限制: 1 Sec  内存限制: 128 MB 提交: 14  解决: 6 题目描述 设计一个算法,将一个带头节点的数据域依次为a1,a2,-,an(n> ...

  8. 逆序数还原(FZU)

    逆序数还原 Accept: 244 Submit: 451 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 有一段时 ...

  9. Uva 10305 给任务排序

    题目链接:https://uva.onlinejudge.org/external/103/10305.pdf 紫书P167 拓扑排序. dfs——从一个点出发,dfs 与之相连的所有点,把本身放入到 ...

  10. Java中数组的特性

    转载:http://blog.csdn.net/zhangjg_blog/article/details/16116613 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具 ...