Как определить количество дней с этого момента до NSDate?

#iphone #objective-c #ios #xcode #nsdate

#iPhone #objective-c #iOS #xcode #nsdate

Вопрос:

Как я могу определить количество дней с этого момента до даты, указанной в моем приложении? Вот что у меня есть до сих пор, но каждый раз появляется «-30», независимо от даты:

 NSDate * selected = [DatePicker date];
NSString * date = [selected description];

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit 
                                                              fromDate:DatePicker.date];

CalLabel1.text = [NSString stringWithFormat:@"%d", [components day]];

NSDateFormatter *temp = [[NSDateFormatter alloc] init];
[temp setDateFormat:@"dd/MM/yyyy"];
NSDate *stDt = [temp dateFromString:[temp stringFromDate:[NSDate date]]];
NSDate *endDt =  [temp dateFromString:[temp stringFromDate:[NSString stringWithFormat:@"%d", [components date]]]];
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];

NSLog(@"%i", [comps day]);
 

Ответ №1:

 NSDate * selected = [DatePicker date];
NSCalendar *gregorian = [[NSCalendar alloc] 
                          initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components: NSDayCalendarUnit 
                                       fromDate: [NSDate date]  
                                         toDate: selected  
                                        options: 0];
int days = [comps day];

NSLog(@"%i", [comps day]);
 

Это вычисляет количество дней между настоящим моментом и выбранной датой. Вся ваша возня с форматером даты была неправильной и ненужной.

Комментарии:

1. В целом это лучше, потому что учитывает любые соответствующие особенности календаря.

Ответ №2:

Как насчет простого использования -timeIntervalSinceNow on NSDate ?

 NSDate *selectedDate = [datePicker date];
NSTimeInterval numberOfSecondsUntilSelectedDate = [selectedDate timeIntervalSinceNow];
NSInteger numberOfDays = numberOfSecondsUntilSelectedDate / 86400; // 86,400 seconds in a day
 

Комментарии:

1. 1 — но, возможно, было бы легче читать, если бы 86400 был константой или чем-то вроде (60 * 60 * 24 ) было написано.

2. Согласен. Я бы использовал константу в производственном коде, но я чувствовал, что комментария достаточно для демонстрационных целей.

3. Лучше использовать API календаря, а не выполнять вычисления вручную. Это легко для дней, но если вы хотите узнать недели или месяцы, это не тривиально.

Ответ №3:

Версия принятого ответа Swift 3.

 let dateComponents = Calendar.current.dateComponents([.day], from: fromDate, to: Date())

// number of days is an optional Int
if let daysCount = dateComponents.day {
    print(daysCount)
}