ios NSDate释义

主要是对ios平台NSDate时间类中的方法的用法解释,以备不时之需:

一、NSDate用来表示公历的GMT时间(格林威治时间)。 有下面几种初始化方法:

1. - (id)init

默认初始化,返回当前时间,也可以直接调用类方法 +(id)date

NSDate *date = [[NSDate alloc] init];

//NSDate *date = [NSDate date];

NSLog(@"print date is %@",date);

将打印出计算机当前时间:2022-01-20 15:30:20 +0000

2. - (id)initWithTimeIntervalSinceNow:(NSTimeInterval)seconds

以当前时间的偏移秒数来初始化,也可以直接调用类方法 + (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds

NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:20];

//NSDate *date = [NSDate dateWithTimeIntervalSinceNow:20];

NSLog(@"print date is %@",date);

假如当前时间是2022-01-20 08:57:20 +0000,那么初始化后得到的时间是2022-01-20 08:57:40 +0000

3. - (id)initWithTimeIntervalSince1970:(NSTimeInterval)seconds

以GMT时间的偏移秒数来初始化,也可以直接调用类方法 + (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds

NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:-20];

//NSDate *date = [NSDate dateWithTimeIntervalSince1970:-20];

NSLog(@"print date is %@",date);

得到的时间是格林威治时间往前20秒,将打印出:1969-12-31 23:59:40 +0000

4. - (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds

以2001-1-1 0:0:0的偏移秒数来初始化,也可以直接调用类方法 + (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds

NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:80];

//NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:80];

NSLog(@"print date is %@",date);

将打印出:2001-01-01 00:01:20 +0000

5. - (id)initWithTimeInterval:(NSTimeInterval)seconds sinceDate:(NSDate *)refDate

以基准时间的偏移秒数来初始化,也可以直接调用类方法 + (id)dateWithTimeInterval:(NSTimeInterval)seconds sinceDate:(NSDate *)date

NSDate *date1 = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:20];

NSLog(@"print date1 is %@",date1);


NSDate *date2 = [[NSDate alloc] initWithTimeInterval:10 sinceDate:date1];

//NSDate *date2 = [NSDate dateWithTimeInterval:10 sinceDate:date1];

NSLog(@"print date2 is %@",date2);

第一个基准时间是2001-01-01 00:00:20 +0000,根据基准时间偏移10秒的结果是2001-01-01 00:00:30 +0000

6.  + (id)distantPast  + (id)distantFuture

这两个是类方法,分别用来返回一个极早的时间点和一个极晚的时间点

NSDate *date = [NSDate distantFuture];

NSLog(@"future date is %@",date);

NSDate *date2 = [NSDate distantPast];

NSLog(@"past date is %@",date2);

distantPast将返回:0001-12-30 00:00:00 +0000,distantFuture将返回:4001-01-01 00:00:00 +0000


二、NSDate的常用对象方法:

1. -(id)dateByAddingTimeInterval:(NSTimeInterval)seconds

返回以当前NSDate对象为基准,偏移多少秒后得到的新NSDate对象。(旧方法 - (id)addTimeInterval:(NSTimeInterval)seconds已被弃用)

NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

NSDate *date2 = [date dateByAddingTimeInterval:-20];

NSLog(@"%@",date2);

2. - (BOOL)isEqualToDate:(NSDate *)anotherDate

将当前对象与参数传递的对象进行比较,根据是否相同返回BOOL值

NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

NSDate *date2 = [NSDate dateWithTimeInterval:0 sinceDate:date];

BOOL isEqual = [date isEqualToDate:date2];

NSLog(@"%i",isEqual);

3. - (NSDate *)earlierDate:(NSDate *)anotherDate  - (NSDate *)laterDate:(NSDate *)anotherDate

比较两个NSDate对象,返回较早/较晚的时间点,并以新NSDate对象的形式返回

NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

NSDate *date2 = [NSDate dateWithTimeInterval:-50 sinceDate:date];

NSDate *date3 = [date earlierDate:date2];

NSLog(@"earlier date is %@",date3);

NSDate *date4 = [date laterDate:date2];

NSLog(@"later date is %@",date4);

4. - (NSComparisonResult)compare:(NSDate *)anotherDate

将当前对象与参数传递的对象进行比较,

如果相同,返回0(NSOrderedSame);

对象时间早于参数时间,返回-1(NSOrderedAscending);

对象时间晚于参数时间,返回1(NSOrderedDescending)

NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

NSDate *date2 = [NSDate dateWithTimeInterval:-50 sinceDate:date];

NSInteger result = [date compare:date2];

NSLog(@"%i",result);

5. - (NSTimeInterval)timeIntervalSince1970

返回当前对象时间与1970-1-1 0:0:0的相隔秒数,也可以这样理解:从1970-1-1 0:0:0开始,经过多少秒到达对象指定时间。

NSDate *date = [NSDate dateWithTimeIntervalSince1970:100];

NSInteger seconds = [date timeIntervalSince1970];

NSLog(@"%i",seconds);

将返回结果100

6. - (NSTimeInterval)timeIntervalSinceReferenceDate

返回当前对象时间与2001-1-1 0:0:0的相隔秒数,也可以这样理解:从2001-1-1 0:0:0开始,经过多少秒到达对象指定时间。

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:-30];

NSInteger seconds = [date timeIntervalSinceReferenceDate];

NSLog(@"%i",seconds);

将返回结果-30,负数代表从2001-1-1 0:0:0开始,倒退30秒到达当前时间。

7. - (NSTimeInterval)timeIntervalSinceNow

返回当前对象时间与客户端时间的相隔秒数,也可以这样理解:从客户端当前时间开始,经过多少秒到达对象指定时间。

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:100];

NSInteger seconds = [date timeIntervalSinceNow];

NSLog(@"%i",seconds);

经测试返回了结果99,但初始化时提供的参数是100。这可能是因为第一句初始化代码到第二句计算代码之间有个1秒内的延时,所以计算时的客户端时间比初始化时的客户端时间快了1秒。

8. - (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate

返回当前对象时间与参数传递的对象时间的相隔秒数,也可以这样理解:从参数时间开始,经过多少秒到达对象执行时间。

NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

NSDate *date2 = [NSDate dateWithTimeInterval:50 sinceDate:date];

NSInteger seconds = [date timeIntervalSinceDate:date2];

NSLog(@"%i",seconds);

将返回结果-50,date为1970-1-1 0:0:0,date2为1970-1-1 0:0:50,从date2的时间开始,倒退50秒到达date的时间。


三、NSDateFormatter 日期格式化类

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的两个最实用的方法是dateFromString和stringFromDate,前者将一个字符串经过格式化后变成NSDate对象,后者将NSDate对象格式化成字符串。

在调用setDateFormat设置格式化字符串时,可以加入一些别的字符串,用单引号来引入,例如:

[formatter setDateFormat:@"yyyy-MM-dd 'some ''special'' string' HH:mm:ss"];

使用NSDateFormatter转换时间字符串时,默认的时区是系统时区,例如在中国一般都是北京时间(+8),如果直接转换会导致结果相差8小时,所以一般的做法是先指定时区为GMT标准时间再转换,例如:

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

[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];


NSDateComponents *compt = [[NSDateComponents alloc] init];

[compt setYear:2013];

[compt setMonth:3];

[compt setDay:13];

[compt setHour:1];

[compt setMinute:55];

[compt setSecond:28];


NSCalendar *calendar = [NSCalendar currentCalendar];

[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate *date = [calendar dateFromComponents:compt];

NSLog(@"%@",date);

NSString *str = [formatter stringFromDate:date];

NSLog(@"%@",str);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,428评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,024评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,285评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,548评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,328评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,878评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,971评论 3 439
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,098评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,616评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,554评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,725评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,243评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,971评论 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,361评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,613评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,339评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,695评论 2 370

推荐阅读更多精彩内容

  • 在IOS中关于时间的问题比较常见,经常会用来获取当前时间,或者根据当前时间去获取某个时间点 本文是关于时间与日期的...
    这位网友阅读 10,049评论 0 9
  • NSDate的常用用法 创建或初始化可用以下方法用于创建NSDate实例的类方法有 (id)date;返回当前时间...
    亦晴工作室阅读 1,280评论 0 2
  • 创建//获取到的是当前时间 格林尼治 时间 +0000 表示0时区NSDate *date1 = [NSDate...
    JokerVxc阅读 3,428评论 1 8
  • 1、Category(类别) 什么是Category 1、Category可以在不获悉不改变原代码的情况下向已有的...
    阿道奇阅读 349评论 0 1
  • 主要有以下几个类: NSDate:表示一个具体的绝对的时间点。NSTimeZone:表示时区信息。NSLocale...
    献国阅读 5,259评论 0 4