Как я могу получить год / месяц / день NSDate
объекта, если нет другой информации? Я понимаю, что я мог бы сделать это с чем-то похожим на это:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Но это, кажется, много хлопот для чего-то такого простого, как получение NSDate
года / месяца / дня. Есть ли другое решение?
objective-c
nsdate
nsdatecomponents
nscalendar
Ричард Дж. Росс III
источник
источник
Ответы:
Поскольку это, по-видимому, мой самый популярный ответ, я постараюсь отредактировать его, чтобы он содержал немного больше информации.
Несмотря на свое название,
NSDate
само по себе это просто точка машинного времени, а не дата. Не существует корреляции между моментом времени, указаннымNSDate
и годом, месяцем или днем. Для этого вам нужно обратиться к календарю. Любой данный момент времени будет возвращать различную информацию о дате в зависимости от того, какой календарь вы просматриваете (например, даты не совпадают в григорианском и еврейском календарях), а григорианский календарь является наиболее широко используемым календарем в Мир - я предполагаю - мы немного предвзяты, чтоNSDate
всегда должны его использовать.NSDate
К счастью, гораздо более двухпартийный.Как
NSCalendar
вы упомянули, получение даты и времени должно будет пройти , но есть более простой способ сделать это:Это создает
NSDateComponents
объект, содержащий день, месяц и год из текущего системного календаря на текущий день. ( Примечание: это не обязательно текущий пользовательский календарь, а только системный календарь по умолчанию.)Конечно, если вы используете другой календарь или дату, вы можете легко это изменить. Список доступных календарей и календарных единиц можно найти в
NSCalendar
справочнике классов . Более подробную информацию оNSDateComponents
можно найти вNSDateComponents
справочнике классов .Для справки, получить доступ к отдельным компонентам из
NSDateComponents
довольно просто:Вы просто должны быть внимательны:
NSDateComponents
не будет содержать достоверную информацию для каких-либо полей, которые вы запрашиваете, если только вы не сгенерировали их с этой действительной информацией (т.е. запроситеNSCalendar
предоставление этой информации с помощьюNSCalendarUnit
s).NSDateComponents
сами по себе не содержат справочной информации - это просто простые структуры, которые содержат номера для доступа к ним. Если вы хотите также получить эру, например,NSDateComponents
вам нужно передать метод генератора изNSCalendar
сNSCalendarUnitEra
флагом.источник
NSCalendar
«s+currentCalendar
метод возвращает календарь системы, и поэтому , если телефон пользователя установлен в режиме японской или тайское время, вы получите другой год. Если вы хотите форсировать определенную календарную систему, создайте календарь и инициализируйте его с правильным языком. Например, для форсирования григорианского календаря вам понадобится следующее:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
Вы можете получить отдельный компонент NSDate, используя NSDateFormatter:
Если вы хотите получить номер месяца вместо сокращения, используйте «ММ». Если вы хотите получить целые числа, используйте
[myDayString intValue];
источник
Просто перефразировать с превосходными Итай (и работает) код, вот что образец вспомогательный класс будет выглядеть, чтобы вернуться в год значение данной переменной NSDate.
Как видите, этот код достаточно легко изменить, чтобы получить месяц или день.
(Я не могу поверить, что мы должны написать наши собственные основные функции даты iOS, как это, в 2013 году ...)
Еще одна вещь: никогда не используйте <и> для сравнения двух значений NSDate.
XCode с радостью примет такой код (без каких-либо ошибок или предупреждений), но его результаты - лотерея. Вы должны использовать функцию сравнения для сравнения NSDates:
источник
В Swift 2.0:
источник
Я пишу этот ответ, потому что это единственный подход, который не возвращает вам необязательные
NSDateComponent
переменные и / или не заставляет их разворачивать (также для Swift 3).Свифт 3
Swift 2
Бонус Swift 3 веселая версия
источник
Новое в iOS 8
ObjC
стриж
источник
Если вы ориентируетесь на iOS 8+, вы можете использовать новые
NSCalendar
удобные методы для достижения этого в более кратком формате.Сначала создайте
NSCalendar
и используйте все, чтоNSDate
требуется.Вы можете извлечь компоненты по отдельности через
component:fromDate:
Или, еще более кратко, используйте
NSInteger
указатели черезgetEra:year:month:day:fromDate:
Для получения дополнительной информации и примеров посмотрите NSDate Manipulation Made Easy в iOS 8 . Отказ от ответственности, я написал пост.
источник
Начиная с iOS 8.0 (и OS X 10) вы можете использовать метод компонента, чтобы упростить получение одного компонента даты, например:
Должно сделать вещи проще и, надеюсь, это будет реализовано эффективно.
источник
Если вы хотите получить отдельные NSDateComponents от NSDate, вам определенно понадобится решение, предложенное Itai Ferber. Но если вы хотите перейти от NSDate напрямую к NSString, вы можете использовать NSDateFormatter .
источник
источник
Вот решение в Swift:
источник
Попробуй это . , ,
Фрагмент кода:
Это дает текущий год, месяц, дату
источник
Попробуйте следующее:
источник
Swift 2.x
Вы можете использовать его как
Вывод
источник
стриж
Более простой способ получить любые элементы даты в виде необязательной строки.
источник
я так делаю ....
источник
Чтобы получить удобочитаемую строку (день, месяц, год), вы можете сделать:
источник