通常后台会给我们一个时间戳活着截至日期(deadLine)。那么无论是时间戳还是一个具体的日期时间点,我们的处理逻辑都是这样的。统一处理成NSDate对象,那么就起名叫做endDate吧。我们还有一个开始时间,就是当前时间,命名为startDate。
我们要取到endDate和startDate的间隔有多久,有多长的时间间隔。那么废话少说,开始看代码,这样更清晰。
//结束时间
detailedDict[@”endTime”]为服务端返回的数据。
NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
if ([detailedDict[@”endTime”] length]==10) {
[dateFormatter setDateFormat:@”yyyy-MM-dd”];
}else{
[dateFormatter setDateFormat:@”yyyy-MM-dd HH:mm:ss”];
}
// NSDate *endDate = [dateFormatter dateFromString:detailedDict[@”endTime”]];
NSDate *endDate = [dateFormatter dateFromString:@”2016-02-20”];
那么这里注意了,如果后台给你的是这样的具体日期,那么我们还要多加一天的时间,毕竟要倒计时到 2016-02-20日的深夜0:00啊,下一秒就是2016-02-21日了。如果后台给的是时间戳,那么不用多加一天,因为时间戳就是个具体的时间点。
NSDate *endDate_tomorrow = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:([endDate timeIntervalSinceReferenceDate] + 24*3600)];
//当前时间
NSDate *startDate = [NSDate date];
//得到相差秒数
NSTimeInterval timeInterval =[endDate_tomorrow timeIntervalSinceDate:startDate];
下面处理UI显示的逻辑
if (timeInterval==0) {
detailCell.yzImageView.hidden = NO;
过期了,倒计时结束了
}else{
detailCell.yzImageView.hidden = YES;
没过期, 倒计时还会继续
}
这里用到这个 dispatch_source_t _timer;
把timer定义为全局的。
if (_timer==nil) {
__block int timeout = timeInterval; //倒计时时间
if (timeout!=0) {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout<=0){ //倒计时结束,关闭
dispatch_source_cancel(_timer);
_timer = nil;
dispatch_async(dispatch_get_main_queue(), ^{
detailCell.dayLabel.text = @"";
detailCell.hourLabel.text = @"00";
detailCell.minuteLabel.text = @"00";
detailCell.secondLabel.text = @"00";
detailCell.yzImageView.hidden = NO;
});
}else{
int days = (int)(timeout/(3600*24));
if (days==0) {
detailCell.dayLabel.text = @"";
}
int hours = (int)((timeout-days*24*3600)/3600);
int minute = (int)(timeout-days*24*3600-hours*3600)/60;
int second = timeout-days*24*3600-hours*3600-minute*60;
dispatch_async(dispatch_get_main_queue(), ^{
if (days==0) {
detailCell.dayLabel.text = @"";
}else{
detailCell.dayLabel.text = [NSString stringWithFormat:@"%d天",days];
}
if (hours<10) {
detailCell.hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
}else{
detailCell.hourLabel.text = [NSString stringWithFormat:@"%d",hours];
}
if (minute<10) {
detailCell.minuteLabel.text = [NSString stringWithFormat:@"0%d",minute];
}else{
detailCell.minuteLabel.text = [NSString stringWithFormat:@"%d",minute];
}
if (second<10) {
detailCell.secondLabel.text = [NSString stringWithFormat:@"0%d",second];
}else{
detailCell.secondLabel.text = [NSString stringWithFormat:@"%d",second];
}
});
timeout--;
}
});
dispatch_resume(_timer);
}
}
转载于:https://my.oschina.net/u/3389486/blog/868473
分享到:
相关推荐
易语言是一种专为中国人设计的编程语言,它的目标是让编程变得简单、直观。"取时间戳"在计算机编程中是一个常见的操作...总的来说,理解并熟练运用"取时间戳"这一功能,对于提升易语言编程的效率和质量是非常有帮助的。
在Windows操作系统中,时间戳通常指的是自1970年1月1日00:00:00(协调世界时,UTC)起至当前时间的总秒数。这个概念在编程和系统管理中非常常见,特别是在...通过理解这些原理和方法,你可以根据实际需求灵活运用。
在实际编程过程中,根据具体需求,你可能还需要了解更多的易语言日期时间处理函数和技巧,以便灵活运用。在处理时间戳时,确保理解时间戳的含义和单位,以及与日期时间的相互转换,这样可以避免在编程中出现错误。
这个压缩包中的"Time"文件很可能是作者整理的Android时间戳相关的代码片段和示例,可以帮助开发者理解并熟练运用时间戳进行日期和时间的操作。通过对这些代码的学习和实践,你可以更好地掌握Android中时间戳的使用...
通过阅读和理解这个文件,你可以更深入地了解如何在实际项目中运用这些技巧。 总结起来,Robot Framework的`DateTime`库为处理时间戳提供了强大而灵活的功能。熟练掌握这些方法,可以帮助我们在自动化测试中更有效...
综上所述,易语言Unix时间戳转格式涉及了对Unix时间戳的理解,易语言的数据类型和日期处理函数的运用,以及实际编程技巧和错误处理。掌握这些知识点,可以帮助你编写出能够准确转换Unix时间戳为易语言格式的源码。
易语言是一种以中文编程为特色的编程环境,旨在降低编程门槛,让更多人能够参与到编程中来。在易语言中,时间戳操作是常见的编程需求之一,主要...在实际项目中,理解并运用这些知识点可以有效提升代码的质量和效率。
时间戳转换器是一种实用工具,它能够帮助用户在时间戳和本地时间之间进行方便快捷的转换。在IT领域,时间戳扮演着至关重要的角色,...时间戳转换器的运用,使得非编程背景的用户也能轻松处理这些时间相关的复杂问题。
在IT领域,时间戳是一个非常重要的概念,尤其是在服务器端编程、数据分析和系统日志记录等方面。Unix时间戳,又称Unix时间或POSIX...通过学习和理解其工作原理,我们可以更好地理解和应用时间戳在实际项目中的运用。
在iOS开发中,时间戳与时间格式化是常见的任务,特别是在处理日期和时间的显示、存储或比较时。时间戳通常表示从一个特定时间点...理解并熟练运用这些类及其方法,可以帮助开发者高效地处理与日期和时间相关的任务。
总的来说,解决.NET Framework安装时的时间戳签名和证书验证问题,需要综合运用各种排查和修复手段,同时保持系统和安全补丁的最新状态,以确保系统安全。在执行任何操作之前,务必做好数据备份,防止意外丢失重要...
在MATLAB开发中,保存带有时间戳的图形是一项常见的需求,尤其在数据分析和可视化过程中。时间戳能够为图像提供一个精确的时间标识,这...通过理解并运用这些工具,我们可以更好地管理和记录我们的计算结果和视觉输出。
在IT领域,尤其是在数据处理和集成的过程中,Kettle(Pentaho Data Integration,简称PDI)是一款非常强大的ETL(Extract, Transform, Load)工具。...通过理解和熟练运用这些功能,我们可以有效地解决此类问题。
正确理解和运用这些函数,能够帮助开发者更有效地处理时间相关问题,确保系统的准确运行。 总结来说,了解如何在C语言环境中进行时间戳与时间的转换,特别是在嵌入式平台上,是每个AI项目实践者和嵌入式开发者必备...
这个过程涉及到的知识点包括:Keil MDK的使用、链接脚本的编写、预处理宏的运用以及可能的文件操作和脚本编程。通过这样的实践,开发者不仅可以提升自身的编程技能,还能提高工作效率,使得项目的版本控制更加精细化...
在IT行业中,时间转换和时间戳转换是编程中常见的任务,尤其在处理日期和时间相关的数据时。这个压缩包文件的标题"date_时间转换_时间戳转换_...理解并熟练运用这些概念和技巧,对于提升软件开发能力是非常有帮助的。
【jQuery时间戳与日期间...了解并熟练运用这些方法,有助于提升开发效率和代码质量。在使用时,只需传入相应参数,即可实现所需的功能。需要注意的是,对于涉及时区的转换,要确保正确处理时区差,以免造成时间的误判。
总结来说,PHP中的时间戳处理涉及到多个函数的综合运用。通过这些函数,可以方便地将日期时间文本转换为时间戳,也可以根据需要将时间戳转换为具体的日期和时间格式。这些操作对于处理涉及日期时间的逻辑至关重要,...
通过理解并熟练运用上述C++时间戳转换的方法,开发者可以更好地处理与时间相关的计算,尤其是在处理高精度时间信息的领域,如点云数据的处理和分析。在实际项目中,确保时间戳的准确转换对于确保数据一致性、事件...
### Python中基于datetime和time模块获取当前...无论是进行数据处理、系统监控还是其他任何需要时间信息的应用场景,都能够灵活运用这些基本操作。希望本文能帮助你更好地理解和使用Python中的日期和时间处理功能。