dateDiff在Objective-C中的实现

在学习iOS App开发中遇到需要计算时间差并格式化输出的需求,没有现成的方法,需要结合NSCalendar和NSDateComponents来实现。所以干脆把代码封装成一个熟悉的dateDiff方法。不过这个方法跟VB和sql里的dateDiff还是有点不一样,虽然可以封装成完全一样,不过我觉得直接返回NSDateComponents会更方便,因为所需要的各种单位上的值都包含在其中了。 我是把代码封装到自己的一个工具类KRUtils里作为类方法,使用起来也很方便。代码如下:

/* dateDiff 方法实现 */   
+(NSDateComponents *) dateDiff:(NSDate *) fromDate toDate:(NSDate *) toDate
{
    NSCalendar *sysCalendar = [NSCalendar currentCalendar];
    unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |
                              NSDayCalendarUnit | NSHourCalendarUnit |
                              NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents *compInfo = [sysCalendar components:unitFlags
                                              fromDate:fromDate
                                              toDate:toDate
                                              options:0];
    return compInfo;
}
/* dateDiff 调用示例 */   
-(void) demo
{
    NSDate *date1 = [[NSDate alloc] init];
    NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:86400];

    NSDateComponents *diffInfo =[KRUtils dateDiff:date1 toDate:date2];
    NSLog(@"相差 %d天%02d小时%02d分钟%02d秒", [diffInfo day],
                                              [diffInfo hour],
                                              [diffInfo minute],
                                              [diffInfo second]);
    //输出结果:“相差 1天00小时00分钟00秒”    
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Activity堆栈管理

task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task栈中...

19810
来自专栏java 成神之路

RocketMQ 底层通信机制 源码分析

RocketMQ 底层通讯是使用Netty来实现的。 下面我们通过源码分析下RocketMQ是怎么利用Netty进行通讯的。

762
来自专栏岑志军的专栏

(3)Cycript

1767
来自专栏非著名程序员

常见面试第三题之Activity的几种启动模式介绍

Activity的几种启动模式介绍 ? 今天我们来讲的是Activity有几种启动模式,其实以前我没太在意这方面的知识,但是我在开发过程中发现,其实了解和...

18910
来自专栏美团技术团队

Node.js Stream - 基础篇

背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分。这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务。譬如,shell通过管道|...

3655
来自专栏谦谦君子修罗刀

程序员面试闪充 -- KVC&KVO

一、键值编码KVC kvc&kvo视频讲解 1、介绍 由于oc的语言特性,使得开发者根本不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Valu...

26111
来自专栏jeremy的技术点滴

py3_cookbook_notes_03

2723
来自专栏前端吧啦吧啦

确认过眼神,你是喜欢Stream的人

摘要:在学习Node的过程中,Stream流是常用的东东,在了解怎么使用它的同时,我们应该要深入了解它的具体实现。今天的主要带大家来写一写可读流的具体实现,就过...

912
来自专栏一“技”之长

iOS数据持久化之二——归档与设计可存储化的数据模型基类

        在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法。虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性。试想,如果...

663
来自专栏前端小叙

js粘贴事件paste简单解析及遇到的坑

在用户执行粘贴操作的时候,js能够获得剪切板的内容,本文讨论一下这个问题。 目前只有Chrome支持获取剪切板中的图片数据。还好需要这个功能的产品目前只支...

3996

扫码关注云+社区