тот же день прошлого месяца ios

Есть ли способ с помощью NSCalender получить тот же день прошлого месяца?

Я использую календарь, который показывает пользователю 1 месяц, как календарь iPad, когда он нажимает кнопку, которую я хочу перейти к предыдущему месяцу, но должен выбрать тот же день, что и раньше.

я хочу просто сделать

[components setMonth:([components month] - 1)];

но это создаст проблемы, когда я перехожу от месяца с 31 днем ​​​​к месяцу с 30 днями, а выбранный день - 31-й.

Мне удалось найти примеры для Android, но не для iOS.

пример для Android

Любая помощь будет оценена


person pa12    schedule 25.01.2013    source источник
comment
Это произойдет и с високосными годами... Итак, что вы хотите на один день меньше или на один день больше? Facebook показывает 28-е число как день рождения для 29-го февраля, родившегося в невисокосный год!!!   -  person Anoop Vaidya    schedule 26.01.2013
comment
каково ваше требование, если 31 декабря вычесть 1 месяц, каким он должен быть?   -  person Zaheer Ahmed    schedule 26.01.2013


Ответы (2)


Ознакомьтесь с этой ссылкой.

Речь идет о добавлении одного месяца, но вы, вероятно, могли бы сделать то же самое с вычитанием.

Изменять

[dateComponents setMonth:1];

в

[dateComponents setMonth:-1];
person Chris Loonam    schedule 25.01.2013
comment
Это может привести к неправильной дате. (31 декабря - › 31 ноября) - person Thorsten; 26.01.2013
comment
Этот ответ правильный (это не приведет к 31 ноября). Если вы видите неправильную дату при регистрации, возможно, это связано с тем, что метод description NSDate форматирует ее как GMT. Убедитесь, что вы показываете обе даты с одинаковым часовым поясом. - person omz; 26.01.2013

Кажется, нет очевидного «правильного» ответа и нет «встроенного» ответа.

Поскольку «простая» идея Криса может привести к недействительным датам, вам, возможно, придется обрабатывать крайние случаи.

Псевдокод для работы с днем-месяцем-годом:

  1. если месяц = ​​декабрь, начните с дня-1-(год-1), иначе день-(месяц-1)-год [используя dateComponents]
  2. проверьте, является ли это допустимой датой (используя NSDateFormatter, как в этот вопрос
  3. повторяйте вычитание одного дня, пока не достигнете действительной даты

Другая идея:

prevMonthDate = startDate;
Repeat
    prevMonthDate = prevMonthDate - 1 day
Until (Month(prevMonthDate) < Month(startDate) Or Year(prevMonthDate) < Year(startDate))
    And (Day(prevMonthDate) <= Day(startDate))

Для этого требуется работа с NSDate и NSDateComponents, ознакомьтесь с Руководство по программированию даты и времени.

person Thorsten    schedule 25.01.2013