如何计算两个日期之间的差异?

Fre*_*nck 109 date objective-c nsdate swift

如何计算2010年1月1日至(例如)2010年2月3日之间的天数?

dre*_*lax 229

NSDate *date1 = [NSDate dateWithString:@"2010-01-01 00:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2010-02-03 00:00:00 +0000"];

NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];

int numberOfDays = secondsBetween / 86400;

NSLog(@"There are %d days in between the two dates.", numberOfDays);
Run Code Online (Sandbox Code Playgroud)

编辑:

请记住,NSDate对象代表精确的时刻,它们没有任何相关的时区信息.当您使用例如一个字符串转换为一个日期NSDateFormatter,该NSDateFormatter转换时间从配置的时区.因此,两个NSDate对象之间的秒数始终与时区无关.

此外,此文档指定Cocoa的时间实现不考虑闰秒,因此如果您需要这样的准确性,您将需要推出自己的实现.

  • 并非所有日子都有86400秒.对于一个很好的例子,这很好,但在现实世界中并不是一个好主意.DST变化,闰秒等都可以搞砸它.NSCalendar可以告诉您给定日期的秒数. (18认同)
  • @RalucaGurau:86400是一天中的秒数(即60秒,60分钟,24小时).月份没有任何关系. (5认同)
  • @muthukumar:不在iOS上,该方法仅在Mac OS X上可用.这个问题标记为`cocoa`而不是`cocoa-touch`,所以这个答案仅适用于Mac OS X. (2认同)

Cas*_*ser 83

你可能想要使用这样的东西:

NSDateComponents *components;
NSInteger days;

components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
        fromDate: startDate toDate: endDate options: 0];
days = [components day];
Run Code Online (Sandbox Code Playgroud)

我相信这种方法可以解决诸如夏令时变化的日期等情况.

  • 还有一种简单的方法可以忽略给定日期的时间吗? (2认同)

Che*_*tan 24

NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
Run Code Online (Sandbox Code Playgroud)

其中,date1date2NSDate的.

另外,请注意以下定义NSTimeInterval:

typedef double NSTimeInterval;
Run Code Online (Sandbox Code Playgroud)


Ank*_*ain 19

看看这个.它使用iOS日历来计算夏令时,闰年.您可以将字符串和条件更改为包含小时和天的分钟.

+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate
{
    NSDateComponents *components;
    NSInteger days;
    NSInteger hour;
    NSInteger minutes;
    NSString *durationString;

    components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute fromDate: startDate toDate: endDate options: 0];

    days = [components day];
    hour = [components hour];
    minutes = [components minute];

    if(days>0)
    {
        if(days>1)
            durationString=[NSString stringWithFormat:@"%d days",days];
        else
            durationString=[NSString stringWithFormat:@"%d day",days];
        return durationString;
    }
    if(hour>0)
    {        
        if(hour>1)
            durationString=[NSString stringWithFormat:@"%d hours",hour];
        else
            durationString=[NSString stringWithFormat:@"%d hour",hour];
        return durationString;
    }
    if(minutes>0)
    {
        if(minutes>1)
            durationString = [NSString stringWithFormat:@"%d minutes",minutes];
        else
            durationString = [NSString stringWithFormat:@"%d minute",minutes];

        return durationString;
    }
    return @""; 
}
Run Code Online (Sandbox Code Playgroud)