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 дня.

  • Swift конвертирует NSDate в 24h формат сбой на устройстве
  • Анализ ISO 8601 с NSDateFormatter
  • Библиотека для работы с правилами повторения в Objective C?
  • Swift 3 - Неоднозначное использование оператора <при сравнении двух дат
  • NSDate dateWithTimeIntervalSince1970: мне нужно вычесть 1800 секунд из NSTimeInterval, чтобы отобразить правильное значение
  • Как определить, является ли формат даты языка месяц / день или день / месяц?
  • Минимальная и максимальная дата в UIDatePicker
  • Часовой пояс изменения NSDate
  • Как преобразовать временную метку unix в удобное для человека время?
  • NSDate не зависит от часового пояса?
  • Дата NSCalendarFromComponents возвращает неправильное значение при использовании недель
  • Interesting Posts

    Как сообщить, что приложение было запущено, нажав push-сообщение

    Исправлен заголовок для UITableview?

    Преобразование Гильберта (аналитический сигнал) с использованием ускорительной платформы Apple?

    Как определить структуру или зависимость, которые используют микрофон

    Когда вам нужно создать отдельный xib для вашего контроллера?

    Рассчитать ETA в Свифте

    Xcode 8: Конструктор интерфейсов показывает другой цвет, который установлен

    Как предотвратить поворот модального UIImagePickerController?

    iOS: как конвертировать видеофайлы в NSData

    Невозможно погладить путь в режиме наложения карты

    Как добавить кнопку «Готово» на клавиатуру?

    HealthKit не обновляется

    AVFoundation Issue с ​​Core Animation на Mac OS X 10.7 Lion

    загрузка приложения iOS с часами 2.0 дает ITC.apps.preReleaseBuild.errors.invalidBinary

    Данные iOS Keychain потеряны при давлении памяти iPhone?

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