NSDate
可以得到当前时间,创建一个NSDate对象并将其输出,能得到当前系统的格林威治时间,即0时区
NSDate *date = [NSDate date];
NSLog(@"%@",date);
格式化输出日期
- 默认格式:年-月-日 时:分:秒 +时区
//创建一个日期格式化对象
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";//规定格式转化,并转化为当前系统的时间
NSString *str = [formatter stringFromDate:date];//获取
NSLog(@"%@",str);
yyyy 年
MM 月
dd 日
HH 24小时制
hh 12小时制
mm 分
ss 秒
- 字符串转为日期
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";//规定格式转化,并转化为当前系统的时间```
NSDate *date = [formatter dataFromString:@"2000-01-01"];
NSCalendar日历
NSCalendar *calendar = [NSCalendar currentCalendar];
CGFloat time = [calendar component:NSCalendarUnitSecond fromData:[NSData data]];
//获取当前秒
处理时间
//秒制时间转换
NSDate *date = [NSDate dateWithTimeIntervalSince1970:秒制时间];
//计算8小时后的时间,0时区+8H=8时区(北京时间)
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:8*60*60];//得到当前系统的格林威治时间,即0时区再+8时区 等于当前北京时间
NSLog(@"%@",date);
//日期相减
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSCalendarUnitMinute fromDate:date toDate:[NSDate date] options:0];
//得到时间差
NSDate *start = [NSDate date];
NSDate *end = [NSDate date];
double time = [end timeIntervalSinceDate:start]
倒计时
- (void)mathTime{
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";//规定格式转化
//开始和结束时间
NSDate *creatDate = [formatter dateFromString:_model.createTime];//获取的时间
NSDate *nowDate = [NSDate dateWithTimeIntervalSinceNow:8*60*60];//当前时间
//时间差
double time = 24*60*60-[nowDate timeIntervalSinceDate:creatDate];
//时间转化 秒制数据 -> NSDate
NSDate *Date = [NSDate dateWithTimeIntervalSinceReferenceDate:time];
NSDateFormatter *timeFormatter = [NSDateFormatter new];
timeFormatter.dateFormat = @"HH : mm : ss";//规定格式转化
_timeDownLab.text = [timeFormatter stringFromDate:Date];
}
NSTimer定时器
两种不同的定时器
NStimer
(时间间隔比较大1秒,几秒)
CADisplaylink
(时间间隔比较小,0.0几秒等)
GCD
定时器
- 启动定时器的两种方法:
- 1:调用
timerwithxxx
创建的timer
,把这个timer
对象手动加到消息循环中才能启动 - 2:调用
scheduleXx
创建的timer
,自动启动(创建完毕后自动启动)
方法一
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(demo) userInfo:nil repeats:YES];
//把定时器添加到当前线程的消息循环中
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
消息循环是在一个指定的模式下运行的,设置的输入事件也需要指定一个模式,默认是NSDefaultRunLoopMode
NSRunLoopCommonModes包括了多种模式
UITrackingRunLoopMode 当滚动scrollView的时候,消息循环的模式自动改变
-(void)demo{
NSLog(@hello!"");
}
方法二 自动启动
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(demo) userInfo:nil repeats:YES];
停止计时器,一旦停止不可重用,需要重新创建
[self.timer invalidate];
self.timer = nil;
计时器优先级
//获取消息当前循环
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];
CADisplaylink
CADisplaylink
是一种以屏幕刷新频率触发的时钟机制,每秒钟执行大约60次左右
CADisplaylink
是一个计时器,可以使绘图代码与视图的刷新频率保持同步,而NSTimer
无法确保计时器实际被触发的准确时间(例如1s999ms和2s的差距,会显示1s和2s)
显示动画,为了保证流畅性,可以使用这个而不是NSTime
,可以达到60帧
- 使用方法定义
CADisplaylink
并制定触发调用方法,将显示链接添加到主运行循环队列
CADisplaylink *link = [CADisplaylink displayLinkWithTarget:self selector:@selector(timeChange)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
随机数生成
C语言函数,随机生成一个无符号的整数(0-((0-2的32次方)-1))
arc4random()
随机生成一个0-n的整数
arc4random()%(n+1)
- 推荐使用:
arc4random_uniform()
生成0-10的整数
int num = arc4random_uniform(10);
NSString stringNum = [NSString stringWithFormat:@"%d",num];