NSDate – год назад, дилемма

Я пытаюсь сделать что-то, что для меня немного сложно. Но я уверен, что у кого-то есть понимание.

Учитывая дату, скажем January 17, 2011 , я пытаюсь выяснить день, соответствующий этой дате год назад. Так что January 17, 2011 – понедельник, а год назад этот день упал January 18, 2010 (понедельник тоже). Оказывается, January 18, 2010 354 дня до January 17, 2011 . Первоначально я думал просто просто вычесть 365 дней для не-високосного года и 366 дней в високосный год, но если вы это сделаете, вы получите January 17, 2010 , это воскресенье, а не понедельник.

Итак, в Objective-C с NSDate и NSCalendar , как я мог реализовать такую ​​функцию, как:

 -(NSDate *)logicalOneYearAgo:(NSDate *)from { } 

Другими словами, n-ый «будний день» n-го месяца (где «будний день» – понедельник или вторник или среда и т. Д.),

5 Solutions collect form web for “NSDate – год назад, дилемма”

Вы используете NSDateComponents следующим образом:

 - (NSDate *)logicalOneYearAgo:(NSDate *)from { NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; NSDateComponents *offsetComponents = [[[NSDateComponents alloc] init] autorelease]; [offsetComponents setYear:-1]; return [gregorian dateByAddingComponents:offsetComponents toDate:from options:0]; } 

Это описано в разделе « Руководство по программированию даты и времени » по календарным вычислениям, « Добавление компонентов к дате»

В частности, интересующий метод – dateByAddingComponents: toDate: options .

Используя пример Apple в качестве основы, чтобы вычесть один год с текущей даты, вы должны сделать следующее:

 NSDate *today = [[NSDate alloc] init]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; /* Create a date components to represent the number of years to add to the current date. In this case, we add -1 to subtract one year. */ NSDateComponents *addComponents = [[NSDateComponents alloc] init]; addComponents.year = - 1; return [calendar dateByAddingComponents:addComponents toDate:today options:0]; 

Я не могу гарантировать, что это самый эффективный способ, но вы можете сделать это, используя NSCalendar и NSDateComponents . Передайте экземпляр NSDate в [yourCalendar components:yourComponents fromDate:yourDate] , [yourCalendar components:yourComponents fromDate:yourDate] год из компонентов, а затем используйте [yourCalendar dateFromComponents:yourComp] .

Извините за отсутствие полного кода, но прошло некоторое время с тех пор, как я работал с этими методами, и я не хочу давать вам код, который не будет работать.

Substract 1 год. Затем выложите 1 день, пока не закончите тот же самый день недели, который вы хотите.

Каждый год «дни недели» возвращаются на 1 день, за исключением случаев, когда есть 29-й промежуток между ними, они возвращаются на 2 дня.

Это потому, что год составляет 52 недели + 1 день (+2 для високосных лет).

Поэтому, если вы будете применять эту логику на неопределенный срок, вы закончите, годами после года, с 16 июня по 24 мая.

Если вы не хотите, чтобы это произошло, вам нужно где-то запомнить контрольный год и основывать на нем свою арифметику.

Например, если «новый» понедельник истекает через 4 дня (потому что прошло 3 года), вы можете предпочесть выбрать время 3 дня вперед вовремя, чтобы не на неопределенный срок вычитать дни, годы за годами.

Надеюсь, поможет.

Ответ оказался довольно простым. Это оказалось из проб и ошибок. Вот ответ.

если год является високосным годом, вычесть 365 дней.

если год не високосный год, вычесть 364 дня.

  • Проблема конвертации iphone NSDate
  • Ошибка даты NSCalendar
  • iOS, как вызвать метод в минуту, каждую минуту
  • Objective-C устанавливает NSDate в текущий UTC
  • Конвертировать дату в формате MM / dd / yyyy в xcode?
  • Преобразование NSString в NSDate (и обратно)
  • iOS: переход между 12/24 часами из строк
  • Показывать относительную дату или время, а не на iOS?
  • iOS - правильное форматирование временных меток между mySQL (apache) и iOS (NSDate)
  • Сортировка объектов NSDate в NSMutableArray с использованием NSSortDescriptor?
  • Как преобразовать строку в дату в строку в Swift iOS?
  • Interesting Posts

    Добавление UINavigationController в мой segue.destinationViewController в Objective-C

    Найти / заменить в Xcode с помощью регулярного выражения

    iOS 6 потоковый проигрыватель com.apple.coremedia.networkbuffering bug

    Как создать землю (холмы), как игра iOS «Contre Jour»?

    Авторотация в ios5 – наиболее распространенные причины, по которым это не удается?

    Как направить вывод printf на тот же объект, что и NSLog?

    NSStream на iphone не работает

    Ошибка iOS 10: UICollectionView получил атрибуты макета для ячейки с пути указателя, который не существует

    Как получить текущую дату в быстром 3?

    FIRInstanceID / WARNING STOP !! Сбросит идентификатор устройства из памяти

    Twitter requestAccessToAccountsWithType предоставил false

    Пользовательский UIView iboutlet не установлен

    iOS10 "Показать больше" "Показать меньше" ошибка

    HTTP «Content-Disposition: attachment» и загрузка файлов в веб-браузере iOS

    Итерация по iPhone Adressbook, вызывающая ошибку adressbook sql db

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.