найти общее количество дней между двумя датами в iphone

Я хотел бы найти общее количество дней между двумя датами.

например сегодня 01-01-2011 (ДД-ММ-ГГГГ), а вторая дата (25-03-2011), как мне найти общее количество дней?

NSDate *currentdate=[NSDate date];
NSLog(@"curretdate is ==%@",currentdate);
NSDateFormatter *tempFormatter1 = [[[NSDateFormatter alloc]init]autorelease];
[tempFormatter1 setDateFormat:@"dd-mm-YYYY hh:mm:ss"];
NSDate *toDate = [tempFormatter1 dateFromString:@"20-04-2011 09:00:00"];

NSLog(@"toDate ==%@",toDate);

person KETAN    schedule 20.05.2011    source источник
comment
возможный дубликат Как получить количество дней между две даты, цель-c   -  person holex    schedule 03.01.2014
comment
возможный дубликат Как я могу сравнить две даты, вернуть количество дней   -  person Jon Reid    schedule 04.01.2014


Ответы (7)


NSCalendar *Calander = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSDateComponents *comps = [[NSDateComponents alloc] init];

[dateFormat setDateFormat:@"dd"];
[comps setDay:[[dateFormat stringFromDate:[NSDate date]] intValue]];
[dateFormat setDateFormat:@"MM"];
[comps setMonth:[[dateFormat stringFromDate:[NSDate date]] intValue]];
[dateFormat setDateFormat:@"yyyy"];
[comps setYear:[[dateFormat stringFromDate:[NSDate date]] intValue]];
[dateFormat setDateFormat:@"HH"];
[comps setHour:05];
[dateFormat setDateFormat:@"mm"];
[comps setMinute:30];

NSDate *currentDate=[Calander dateFromComponents:comps];

NSLog(@"Current Date is :- '%@'",currentDate);


[dateFormat setDateFormat:@"dd"];
[comps setDay:[[dateFormat stringFromDate:yourDate] intValue]];
[dateFormat setDateFormat:@"MM"];
[comps setMonth:[[dateFormat stringFromDate:yourDate] intValue]];
[dateFormat setDateFormat:@"yyyy"];
[comps setYear:[[dateFormat stringFromDate:yourDate] intValue]];
[dateFormat setDateFormat:@"HH"];
[comps setHour:05];
[dateFormat setDateFormat:@"mm"];
[comps setMinute:30];

NSDate *reminderDate=[Calander dateFromComponents:comps];

    //NSLog(@"Current Date is :- '%@'",reminderDate);

    //NSLog(@"Current Date is :- '%@'",currentDate);

    NSTimeInterval ti = [reminderDate timeIntervalSinceDate:currentDate];

    //NSLog(@"Time Interval is :- '%f'",ti);
    int days = ti/86400;

[dateFormat release];
[Calander release];
[comps release];

Надеюсь, это сработает для вас........

person SJS    schedule 20.05.2011
comment
извините, но я не могу понять вашу дату, и я попробовал другую дату, и это даст мне разницу в -145 дней, что не так - person KETAN; 20.05.2011

Более простой способ сделать это:

// This just sets up the two dates you want to compare
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [formatter dateFromString:@"01-01-2011"];
NSDate *endDate = [formatter dateFromString:@"25-03-2011"];

// This performs the difference calculation
unsigned flags = NSDayCalendarUnit;
NSDateComponents *difference = [[NSCalendar currentCalendar] components:flags fromDate:startDate toDate:endDate options:0];

// This just logs your output
NSLog(@"Start Date, %@", startDate);
NSLog(@"End Date, %@", endDate);
NSLog(@"%ld", [difference day]);

И результаты таковы:

Дата начала, 01.01.2011 00:00:00 +0000

Дата окончания, 25.03.2011 00:00:00 +0000

83

Попытка использовать секунды и манипулировать ими для расчета разницы во времени — плохая идея. Существует множество классов и методов, предоставляемых Cocoa для вычислений календаря, и вы должны использовать их как можно чаще.

person Abizern    schedule 17.09.2011

Попробуй это

- (int) daysToDate:(NSDate*) endDate
{
    //dates needed to be reset to represent only yyyy-mm-dd to get correct number of days between two days.
    NSDateFormatter *temp = [[NSDateFormatter alloc] init];
    [temp setDateFormat:@"yyyy-MM-dd"];
    NSDate *stDt = [temp dateFromString:[temp stringFromDate:self]];
    NSDate *endDt =  [temp dateFromString:[temp stringFromDate:endDate]];
    [temp release]; 
    unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [gregorian components:unitFlags fromDate:stDt  toDate:endDt  options:0];
    int days = [comps day];
    [gregorian release];
    return days;
}
person Chetan Bhalara    schedule 20.05.2011
comment
При использовании точного времени я получал неверную разницу во времени календарного дня. Это правильное решение! Здорово! - person Nikolay Frick; 04.01.2012
comment
Спасибо нфрик. Можете ли вы помочь мне с другой вещью? - person Chetan Bhalara; 04.01.2012
comment
Вероятно, вам следует указать, что это было скопировано из ответа Джошуа Вайнберга здесь: stackoverflow.com/a/3142380/19679 - person Brad Larson; 07.11.2012

//попробуй

if((![txtFromDate.text isEqualToString:@""]) && (![txtToDate.text isEqualToString:@""]))
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"MM/dd/yyyy"];
        NSDate *startDate = [formatter dateFromString:txtFromDate.text];
        NSDate *endDate = [formatter dateFromString:txtToDate.text];
        unsigned flags = NSDayCalendarUnit;
        NSDateComponents *difference = [[NSCalendar currentCalendar] components:flags fromDate:startDate toDate:endDate options:0];

        int dayDiff = [difference day];

        lblNoOfDays.text =[NSString stringWithFormat:@"%d",dayDiff];
    }
person user3091160    schedule 03.01.2014

чтобы найти количество дат между датой начала и датой окончания.

 NSCalendar *cale=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
    unsigned unitFlags=NSMonthCalendarUnit| NSDayCalendarUnit;
    NSDateComponents *comp1=[cale components:unitFlags fromDate:startDate toDate:endDate options:0];

    NSInteger days=[comp1 day];
    NSLog(@"Days %ld",(long)days);
person MAHBOOB    schedule 19.02.2014

Пожалуйста, попробуйте это. Надеюсь, это поможет вам...

NSDateFormatter *df=[[NSDateFormatter alloc] init];
// Set the date format according to your needs
[df setDateFormat:@"MM/dd/YYYY hh:mm a"]; //for 12 hour format
//[df setDateFormat:@"MM/dd/YYYY HH:mm "]  // for 24 hour format
NSDate *date1 = [df dateFromString:firstDateString];
NSDate *date2 = [df dateFromString:secondDatestring];
NSLog(@"%@f is the time difference",[date2 timeIntervalSinceDate:date1]);
[df release];
person Mitesh Khatri    schedule 20.05.2011

person    schedule
comment
Будьте осторожны, это не учитывает смену часов. Например, если разница, например. 1,6 дня, он может вернуть 1 день вместо 2, и это может быть хуже в особом случае, если между двумя датами произошло переключение на летнее время. Предпочтительно использовать NSDateComponents для получения компонентов даты, таких как дни, месяцы, годы и т. д. - person AliSoftware; 18.06.2011
comment
хорошо, но вы можете легко понять эту простую логику. и кто-нибудь делает их код после получения идеи - person AJPatel; 06.08.2011
comment
@AJPatel, как я могу получить записи из date.example: 09-12-2016 00:00:00 между 09-12-2016 23:59:59 - person Krutarth Patel; 12.09.2016
comment
@KrutarthPatel Используйте фильтр предикатов в своей коллекции. Как @dateField › %@ AND dateField ‹= %@,startDate,endDate - person AJPatel; 24.09.2016