时间魔法-NSDate回忆录

简介

总结了下Swift中关于时间的一些简单操作,顺便也把OC的有关NSDate的一些常用方法回顾了一遍,记录成这篇NSDate回忆录。

  • 日期时间的比较
  • NSDate 简单实用
  • NSDateFormatter 对日期时间对象做格式化操作的类
  • NSDateComponents 的简单使用

time_oc

日期时间的比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 当前时间
NSDate *currentDate = [NSDate date];
// 比当前时间晚一个小时的时间
NSDate *laterDate = [[NSDate alloc] initWithTimeInterval:60*60 sinceDate:[NSDate date]];
// 比当前时间早一个小时的时间
NSDate *earlierDate = [[NSDate alloc] initWithTimeInterval:-60*60 sinceDate:[NSDate date]];
// 比较哪个时间晚
if ([currentDate laterDate:laterDate]) {
// current-2016-05-25 13:50:27 +0000比later-2016-05-25 14:50:27 +0000晚
NSLog(@"current-%@比later-%@晚",currentDate,laterDate);
}
// 比较哪个时间早
if ([currentDate earlierDate:earlierDate]) {
// current-2016-05-25 13:50:27 +0000 比 earlier-2016-05-25 12:50:27 +0000 早
NSLog(@"current-%@ 比 earlier-%@ 早",currentDate,earlierDate);
}
*
- (NSComparisonResult)compare:(NSDate *)other;
该方法用于排序时调用:
. 当实例保存的日期值与anotherDate相同时返回NSOrderedSame
. 当实例保存的日期值晚于anotherDate时返回NSOrderedDescending
. 当实例保存的日期值早于anotherDate时返回NSOrderedAscending
*/
if ([currentDate compare:earlierDate]==NSOrderedDescending) {
// 打印结果
NSLog(@"current 晚");
}
if ([currentDate compare:currentDate]==NSOrderedSame) {
// 打印结果
NSLog(@"时间相等");
}
if ([currentDate compare:laterDate]==NSOrderedAscending) {
// 打印结果
NSLog(@"current 早");
}

NSDate 简单实用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//-获取当前日期时间的方法
//实例方法
NSDate *date1=[[NSDate alloc]init];
NSLog(@"date1:%@",date1); //2016-05-25 13:06:12 +0000
//类方法
NSDate *date2=[NSDate date];
NSLog(@"date2:%@",date2); //2016-05-25 13:06:12 +0000
//获取从1970年1月1日00:00到date2的秒数
NSTimeInterval interval= [date2 timeIntervalSince1970];
NSLog(@"%f",interval); //1464182226.511477
//*********可以加一个延时操作
//[NSThread sleepForTimeInterval:2.f];
for(int i=0;i<10000;i++){}
//*********
//计算两个时间差(秒数)
interval=[date2 timeIntervalSinceDate:date1];
NSLog(@"%f",interval); //0.001625
//date1距现在的时间差
interval=[date1 timeIntervalSinceNow];
NSLog(@"%f",interval); //-0.001935
//-得到date2的后一天(单位-秒)的时间对象
//实例方法:
NSDate *date3=[date2 dateByAddingTimeInterval:24*3600];
NSLog(@"date3:%@",date3); //2016-05-26 13:18:21 +0000
//类方法:
NSDate *date4=[NSDate dateWithTimeInterval:24*3600 sinceDate:date2];
NSLog(@"date4:%@",date4); //2016-05-26 13:18:21 +0000
//得到距现在多少秒后的一个日期时间对象
NSDate *date5=[NSDate dateWithTimeIntervalSinceNow:3*24*3600];
NSLog(@"date5:%@",date5); //2016-05-28 13:18:21 +0000
//获取将来的一个日期时间对象
NSDate *date6=[NSDate distantFuture];
NSLog(@"date6:%@",date6); //4001-01-01 00:00:00 +0000
//获取过去的一个日期时间对象
NSDate *date7=[NSDate distantPast];
NSLog(@"date7:%@",date7); //0000-12-30 00:00:00 +0000

NSDateFormatter 对日期时间对象做格式化操作的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
NSDateFormatter *format=[[NSDateFormatter alloc]init];
[format setDateStyle:NSDateFormatterMediumStyle]; //设置日期的样式
[format setTimeStyle:NSDateFormatterMediumStyle]; //设置时间的样式
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]]; //设置时区
NSString *styledate= [format stringFromDate:date1];
NSLog(@"styledate:%@",styledate); //May 25, 2016, 9:18:21 PM
[format setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; //自定义格式字符串
NSString *sdate=[format stringFromDate:date1]; //将NSDate对象转换为字符串
NSLog(@"sdate:%@",sdate); //2016-05-25 09:18:21
//将字符串形式的日期时间转换为NSDate对象(保证字符串的形式与format中的形式一致)
NSString *str=@"2016-05-25 09:15:30";
NSDate *date8=[format dateFromString:str];
NSLog(@"date8:%@",date8); //2015-07-09 16:10:30 +0000
//时间格式化字符串
NSDate *newdate=[NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss MMM eee a"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]]; //设置时区
NSString *strdate = [formatter stringFromDate:newdate];
NSLog(@"%@",strdate); //2016-05-25 21:18:21 May Wed PM
//时间字符串转换为时间类型
NSDateFormatter * formatter2 = [[NSDateFormatter alloc]init];
NSString * nstr =@"2016年05月25日 9点14分18秒";
[formatter2 setDateFormat:@"yyyy年MM月dd日 hh点mm分ss秒"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]]; //设置时区
NSDate * date9 = [formatter2 dateFromString:nstr];
ps:NSDateFormatter 是时间的一些配置项:对应的时区、展示的格式等等。如果服务器没有返回时间戳,而是返回了默认 “Asia/Shanghai” 时区的字符串时间(XXXX年X月X日),这时候在转NSDate时就必须要设置清楚这个时间所属的时区,否则会被当做是零时区的时间。

NSDateComponents 的简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//获取系统时间的年月日时分秒部分
NSCalendar *cal = [NSCalendar currentCalendar];
//Mac 10.10以前的系统使用 NSYearCalendarUnit
unsigned int unitFlags = NSCalendarUnitYear |NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
NSDateComponents *d = [cal components:unitFlags fromDate:newdate];
NSLog(@"年=%ld",[d year]); //年=2016
NSLog(@"月=%ld",[d month]); //月=5
NSLog(@"日=%ld",[d day]); //日=25
NSLog(@"时=%ld",[d hour]); //时=21
NSLog(@"分=%ld",[d minute]); //分=18
NSLog(@"秒=%ld",[d second]); //秒=21
//将传入时间字符串转换成需要的时间格式
NSString *dateStr=@"2013-08-13 20:28:40";
NSDateFormatter *format1=[[NSDateFormatter alloc] init];
[format1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *fromdate=[format1 dateFromString:dateStr];
//解决时分秒转换不准确问题--相差了8小时,是时区的问题
NSTimeZone *fzone = [NSTimeZone systemTimeZone];
NSInteger finterval = [fzone secondsFromGMTForDate:date9];
NSDate *fDate = [date9 dateByAddingTimeInterval:finterval];
NSLog(@"%@",fDate); //2014-05-01 10:23:18 +0000
//将传入时间字符串转换成需要的时间格式
NSString *dateStr=@"2013-08-13 20:28:40";
NSDateFormatter *format1=[[NSDateFormatter alloc] init];
[format1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *fromdate=[format1 dateFromString:dateStr];
//解决时分秒转换不准确问题
NSTimeZone *fromzone = [NSTimeZone systemTimeZone];
NSInteger frominterval = [fromzone secondsFromGMTForDate: fromdate];
NSDate *fromDate = [fromdate dateByAddingTimeInterval: frominterval];
NSLog(@"fromdate=%@",fromDate);
NSDate *currentDate = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[currentDate timeIntervalSince1970]];
NSLog(@"currentDate == %@", timeSp); //1464182301
NSTimeInterval time = [timeSp doubleValue];
NSTimeInterval addTime = 60 * 60 * 24 * 7;
time = time + addTime;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY/MM/dd hh:mm:ss SS"];
NSString *dateString = [dateFormatter stringFromDate:currentDate];
NSString *year = [dateString substringToIndex:4];
NSString *month = [dateString substringWithRange:NSMakeRange(5, 2)];
NSString *day = [dateString substringWithRange:NSMakeRange(8, 2)];
NSLog(@"%@-%@-%@", year, month, day); //2016-05-25