如何获得两个日期之间的差异?

时间:2010-03-17 12:42:57

标签: cocoa-touch iphone-sdk-3.0 cocos2d-iphone

格式有两个日期(MM / dd / yyyy hh:mm:ss:SS)。对于这两个日期,我已使用(stringFromDate)方法将两个日期转换为字符串。但我无法区分它们并在我的控制台中显示它们。请告诉我如何获得它? 谢谢。

4 个答案:

答案 0 :(得分:3)

示例

    NSDate *today = [NSDate date];

NSTimeInterval dateTime;


if ([visitDate isEqualToDate:today])   //visitDate is a NSDate

{

NSLog (@"Dates are equal");

}

dateTime = ([visitDate timeIntervalSinceDate:today] / 86400);  

if(dateTime < 0) //Check if visit date is a past date, dateTime returns - val

{

NSLog (@"Past Date");

}

else 

{   
NSLog (@"Future Date");

}

答案 1 :(得分:2)

将日期保留为日期,获取它们之间的差异,然后打印差异。

来自docs on NSCalendar并假设格里高利是NSCalendar:

NSDate *startDate = ...;

NSDate *endDate = ...;

unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *comps = [gregorian components:unitFlags fromDate:startDate  toDate:endDate  options:0];

int months = [comps month];

int days = [comps day];

答案 2 :(得分:0)

通常我会看到日期增量计算是通过将日/年值转换为平日来实现的(通常是从某些起始epoch开始的几天,如1970年1月1日)。

为了帮助解决这个问题,我发现在每个月开始的年份中创建一个表格是有帮助的。这是我最近用过的一个课程。

namespace {
    // Helper class for figuring out things like day of year
    class month_database {
    public:
        month_database () {

            days_into_year[0] = 0;
            for (int i=0; i<11; i++) {
                days_into_year[i+1] = days_into_year[i] + days_in_month[i];
            }
        };

        // Return the start day of the year for the given month (January = month 1).
        int start_day (int month, int year) const {

            // Account for leap years. Actually, this doesn't get the year 1900 or 2100 right,
            // but should be good enough for a while.
            if ( (year % 4) == 0 && month > 2) {
                return days_into_year[month-1] + 1;
            } else {
                return days_into_year[month-1];
            }
        }
    private:
        static int const days_in_month[12];

        // # of days into the year the previous month ends
        int days_into_year[12];
    };
    // 30 days has September, April, June, and November...
    int const month_database::days_in_month[12] = {31, 28, 31, 30,   31, 30, 31, 31,   30, 31, 30, 31};

    month_database month;
}

正如您从start_day方法中看到的那样,您将要解决的主要问题是您的范围中包含多少闰日。在我们的时代内,我在那里使用的计算已经足够了。多年包含闰日的实际规则为discussed here

  

2月29日格里高利历,   今天使用最广泛的是约会   每四次只发生一次   年,在几年内可被4整除,   如1976年,1996年,2000年,2004年,2008年,   2012年或2016年(除了   世纪年不能被400整除,   如1900)。

答案 3 :(得分:0)

如果您只想要天数差异,可以这样做。 (基于mihir mehta的回答。)

const NSTimeInterval kSecondsPerDay = 60 * 60 * 24;
- (NSInteger)daysUntilDate:(NSDate *)anotherDate {
    NSTimeInterval secondsUntilExpired = [self timeIntervalSinceDate:anotherDate];
    NSTimeInterval days = secondsUntilExpired / kSecondsPerDay;
    return (NSInteger)days;
}