Как проверить, NSDate
принадлежит ли сегодня?
Я проверял это, используя первые 10 символов из [aDate description]
. [[aDate description] substringToIndex:10]
возвращает строку, "YYYY-MM-DD"
так что я сравнил строку со строкой, возвращенной [[[NSDate date] description] substringToIndex:10]
.
Есть ли более быстрый и / или аккуратный способ проверки?
Спасибо.
ios
objective-c
cocoa-touch
nsdate
nscalendar
Seunghoon
источник
источник
Ответы:
В macOS 10.9+ и iOS 8+ в NSCalendar / Calendar есть метод, который делает именно это!
Так что вы бы просто сделать
Objective-C:
Свифт 3:
источник
Вы можете сравнить компоненты даты:
Редактировать:
Мне больше нравится метод Стефана, я думаю, что он делает более понятным и понятным утверждение if:
Крис, я включил ваше предложение. Мне пришлось посмотреть, какая была эпоха, поэтому для тех, кто не знает, она различает BC и AD. Это, вероятно, не нужно для большинства людей, но это легко проверить и добавить определенности, поэтому я включил его. Если вы идете на скорости, это, вероятно, не очень хороший метод в любом случае.
ПРИМЕЧАНИЕ, как и во многих ответах по SO, через 7 лет это полностью устарело. В Swift сейчас просто используют
.isDateInToday
источник
Это ответ на ваш вопрос, но если вы хотите напечатать NSDate с «Today» или «Yesterday», используйте функцию
для NSDateFormatter
источник
Я попытался бы нормализовать сегодняшнюю дату до полуночи, а вторую дату - до полуночи, а затем сравнить, если это та же самая дата NSD.
Из примера Apple, вот как вы нормализуетесь до полуночи сегодняшней даты, сделайте то же самое для второй даты и сравните:
источник
Расширение Working Swift 3 & 4 по предложению Catfish_Man:
источник
Не нужно манипулировать компонентами, эпохами и прочим.
NSCalendar предоставляет метод для получения начала определенной единицы времени для существующей даты.
Этот код получит начало сегодняшнего дня и другую дату и сравнит это. Если он оценивает
NSOrderedSame
, обе даты в один и тот же день - так сегодня.источник
Работал для меня на Swift 2.0
источник
Свифт версия лучшего ответа:
источник
Обратитесь к документации Apple, озаглавленной «Выполнение календарных расчетов» [ссылка] .
В листинге 13 на этой странице показано, что для определения количества ночей между днями вы используете:
Затем вы можете определить, совпадают ли два дня, используя этот метод, и посмотреть, вернет ли он 0 или нет.
источник
Вы также можете проверить временной интервал между вашей датой и текущей датой:
Это даст вам временной интервал в секундах между myDate и текущей датой / временем.
Link .
Изменить: Примечание для всех: я хорошо знаю, что [myDate timeIntervalSinceNow] не однозначно определяет, является ли myDate сегодня.
Я оставляю этот ответ как есть, так что если кто-то ищет что-то подобное и [myDate timeIntervalSinceNow] полезен, он может найти его здесь.
источник
timeIntervalSinceNow
как это описано во многих других сообщениях. Также обработка сравнения дней с проверкой секунд поощряет подверженное ошибкам деление на 86400.Быстрое расширение на основе лучших ответов:
источник
Если у вас много таких сравнений дат, то звонки для
calendar:components:fromDate
начала занимают много времени. Согласно некоторому профилированию, которое я сделал, они кажутся довольно дорогими.Допустим, вы пытаетесь определить, какие из некоторого массива дат, скажем
NSArray *datesToCompare
, совпадают с определенным днем, скажемNSDate *baseDate
, затем вы можете использовать что-то вроде следующего (частично адаптированный из ответа выше):Вывод:
источник
Существует более простой способ, чем многие из приведенных выше ответов!
источник
Это, вероятно, может быть переработано как категория NSDate, но я использовал:
(Однако, сравнивая две строки даты, как в первоначальном вопросе, вы чувствуете себя «чище» ..)
источник
comps
когда вы сразу устанавливаете их на ноль? Кроме того, я думаю, что вы должны включить эпоху.для iOS7 и более ранних версий:
источник
Проверьте нашу Эрику Садун здорово
NSDate extension
. Очень прост в использовании. Хорошо это здесь:http://github.com/erica/NSDate-Extensions
Это уже есть в этом посте: https://stackoverflow.com/a/4052798/362310
источник
Правильное и безопасное решение без принудительной распаковки, работающее на Swift 2.2 и до iOS 8:
источник
Вот мой ответ за 2 цента, основанный на принятом ответе, но также поддерживающий более новый API. Примечание: я использую григорианский календарь, так как большинство меток времени - GMT, но меняйте свой, как считаете нужным
источник
Мое решение - подсчитать, сколько дней прошло с 1970 года, делением и сравнить целую часть.
источник
источник