#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)
}