Swift имеет свой Dateтип. Не нужно использовать NSDate.
Создание даты и времени в Swift
В Swift даты и время хранятся в 64-битном числе с плавающей запятой, которое измеряет количество секунд с базовой даты 1 января 2001 года в 00:00:00 UTC . Это выражено в Dateструктуре . Следующее даст вам текущую дату и время:
let currentDateTime =Date()
Для создания других дат-времени вы можете использовать один из следующих методов.
Способ 1
Если вам известно количество секунд до или после контрольной даты 2001 года, вы можете использовать ее.
let someDateTime =Date(timeIntervalSinceReferenceDate:-123456789.0)//Feb2,1997,10:26 AM
Способ 2
Конечно, было бы проще использовать такие вещи, как годы, месяцы, дни и часы (а не относительные секунды) для создания Date. Для этого вы можете использовать, DateComponentsчтобы указать компоненты, а затем Calendarсоздать дату. Это Calendarдает Dateконтекст. Иначе как бы он узнал, в каком часовом поясе или календаре это выражать?
// Specify date componentsvar dateComponents =DateComponents()
dateComponents.year =1980
dateComponents.month =7
dateComponents.day =11
dateComponents.timeZone =TimeZone(abbreviation:"JST")// Japan Standard TimedateComponents.hour =8
dateComponents.minute =34// Create date from componentslet userCalendar =Calendar.current // user calendarlet someDateTime = userCalendar.date(from: dateComponents)
Другие сокращения часовых поясов можно найти здесь . Если вы оставите это поле пустым, по умолчанию будет использоваться часовой пояс пользователя.
Способ 3
Наиболее кратким способом (но не обязательно лучшим) может быть использование DateFormatter.
let formatter =DateFormatter()
formatter.dateFormat ="yyyy/MM/dd HH:mm"let someDateTime = formatter.date(from:"2016/10/08 22:31")
Теперь вы можете создать NSDate из Swift, просто выполнив:
NSDate(dateString:"2014-06-06")
Обратите внимание, что эта реализация не кэширует NSDateFormatter, что может потребоваться из соображений производительности, если вы собираетесь создавать множество NSDates таким способом.
Также обратите внимание, что эта реализация просто потерпит крах, если вы попытаетесь инициализировать NSDate, передав строку, которая не может быть проанализирована правильно. Это связано с принудительной разверткой необязательного значения, возвращаемого функцией dateFromString. Если вы хотите вернуть a nilпри плохом разборе, в идеале вы должны использовать неисправный инициализатор; но вы не можете сделать это сейчас (июнь 2015 г.) из-за ограничений в Swift 1.2, поэтому следующий ваш лучший выбор - использовать метод фабрики классов.
Это указывает, что расширение предоставляет инициализатор, который фактически делегирует инициализацию уже существующему назначенному инициализатору, который в этом случае является NSDate.init (timeInterval:, sinceDate :) initializer. Это описано на странице 275 книги Swift Programming Language.
Водоросль
1
Один недостаток, который я вижу в приведенном выше коде, - повторное создание при NSDateFormatterкаждом доступе к функции. Как говорится в Руководстве по форматированию даты Создание средства форматирования даты не является дешевой операцией . Кроме того, этот класс является поточно-ориентированным, начиная с iOS7, поэтому его можно безопасно использовать для всех NSDateрасширений.
Евгений Дубинин
@eugenedubinin правильно. Вот почему я сказал, что «эта реализация не кэширует NSDateFormatter, что может потребоваться для повышения производительности».
водорослевые
1
Какое ограничение в Swift 1.2? Функция «сбой инициализатора» доступна с версии Swift 1.1 .
Франклин Ю
48
У Swift нет собственного типа Date, но вы должны использовать существующий NSDateтип Cocoa , например:
Мне пришлось изменить строку: var date = gregorian? .DateFromComponents (c), но я не понимаю, почему, и синтаксический анализ dateFmt.dateFromString тоже жалуется. Есть какие-нибудь подсказки? Ах, я изменил тип возврата функции с NSDate на NSDate? что позволяет компилировать. Но я не уверен, почему это должно быть обнуляемым.
Сенатор
1
@TheSenator NSCalendar init возвращает необязательный (?), Поэтому григорианский является необязательным (?). Доступ к необязательному необязательному необязательному объединению в цепочку для получения такого григорианского доступа. .DateFromCoomponents - это необязательное сцепление, позволяющее развернуть значение из опций григорианского (NSCalendar). Больше для Опционального сцепления здесь
iluvatar_GR
Начиная с iOS 8, NSGregorianCalendar устарел, поэтому вместо него следует использовать NSCalendarIdentifierGregorian
Adam Knights,
2
@ Сенатор жалуется, потому что Swift имеет структуру Date, и этот код снова объявляет Date как класс. Таким образом, вы должны сделать что-то вроде: «Дата продления» и «Статическая функция»
Запорожченко Александр
Памятка о разборе строки назад к дате. Строка "1979-07-01" с "yyyy-MM-dd" для NSDateFormatterметода date(from:). Это возвращается nil. Я нашел эту проблему в журнале сбоев fabric.io.
AechoLiu
12
Вот как я это сделал в Swift 4.2:
extensionDate{/// Create a date from specified parameters
///
/// - Parameters:
/// - year: The desired year
/// - month: The desired month
/// - day: The desired day
/// - Returns: A `Date` object
staticfunc from(year:Int, month:Int, day:Int)->Date?{let calendar =Calendar(identifier:.gregorian)var dateComponents =DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = day
return calendar.date(from: dateComponents)??nil}}
Использование:
let marsOpportunityLaunchDate =Date.from(year:2003, month:07, day:07)
Мне часто нужно комбинировать значения даты из одного места со значениями времени для другого. Я написал вспомогательную функцию для достижения этой цели.
Создание средства форматирования даты - не дешевая операция. Если вы, вероятно, будете часто использовать средство форматирования, обычно более эффективно кэшировать один экземпляр, чем создавать и распоряжаться несколькими экземплярами. Одним из подходов является использование статической переменной
И хотя я согласен с @Leon, что это должен быть неудачный инициализатор, когда вы вводите начальные данные, у нас может быть тот, который не является неисправным (как и есть UIImage(imageLiteralResourceName:)).
NSDate
же, как в Objective-C?Ответы:
Swift имеет свой
Date
тип. Не нужно использоватьNSDate
.Создание даты и времени в Swift
В Swift даты и время хранятся в 64-битном числе с плавающей запятой, которое измеряет количество секунд с базовой даты 1 января 2001 года в 00:00:00 UTC . Это выражено в
Date
структуре . Следующее даст вам текущую дату и время:Для создания других дат-времени вы можете использовать один из следующих методов.
Способ 1
Если вам известно количество секунд до или после контрольной даты 2001 года, вы можете использовать ее.
Способ 2
Конечно, было бы проще использовать такие вещи, как годы, месяцы, дни и часы (а не относительные секунды) для создания
Date
. Для этого вы можете использовать,DateComponents
чтобы указать компоненты, а затемCalendar
создать дату. ЭтоCalendar
даетDate
контекст. Иначе как бы он узнал, в каком часовом поясе или календаре это выражать?Другие сокращения часовых поясов можно найти здесь . Если вы оставите это поле пустым, по умолчанию будет использоваться часовой пояс пользователя.
Способ 3
Наиболее кратким способом (но не обязательно лучшим) может быть использование
DateFormatter
.В технических стандартах Unicode показать другие форматы , что
DateFormatter
подставки.Ноты
Смотрите мой полный ответ о том, как отображать дату и время в удобочитаемом формате. Также прочитайте эти отличные статьи:
источник
Лучше всего это сделать с помощью расширения существующего
NSDate
класса.Следующее расширение добавляет новый инициализатор, который будет создавать дату в текущей локали, используя строку даты в указанном вами формате.
Теперь вы можете создать NSDate из Swift, просто выполнив:
Обратите внимание, что эта реализация не кэширует NSDateFormatter, что может потребоваться из соображений производительности, если вы собираетесь создавать множество
NSDate
s таким способом.Также обратите внимание, что эта реализация просто потерпит крах, если вы попытаетесь инициализировать
NSDate
, передав строку, которая не может быть проанализирована правильно. Это связано с принудительной разверткой необязательного значения, возвращаемого функциейdateFromString
. Если вы хотите вернуть anil
при плохом разборе, в идеале вы должны использовать неисправный инициализатор; но вы не можете сделать это сейчас (июнь 2015 г.) из-за ограничений в Swift 1.2, поэтому следующий ваш лучший выбор - использовать метод фабрики классов.Более сложный пример, который решает обе проблемы, находится здесь: https://gist.github.com/algal/09b08515460b7bd229fa .
Обновление для Swift 5
источник
NSDateFormatter
каждом доступе к функции. Как говорится в Руководстве по форматированию даты Создание средства форматирования даты не является дешевой операцией . Кроме того, этот класс является поточно-ориентированным, начиная с iOS7, поэтому его можно безопасно использовать для всехNSDate
расширений.У Swift нет собственного типа Date, но вы должны использовать существующий
NSDate
тип Cocoa , например:Который вы можете использовать как:
источник
NSDateFormatter
методаdate(from:)
. Это возвращаетсяnil
. Я нашел эту проблему в журнале сбоев fabric.io.Вот как я это сделал в Swift 4.2:
Использование:
источник
dateComponents
Согласно документации Apple
Пример :
источник
В Swift 3.0 вы установили объект даты для этого способа.
источник
Лично я думаю, что это должен быть неудачный инициализатор:
В противном случае строка с неверным форматом вызовет исключение.
источник
Согласно ответу @mythz, я решил опубликовать обновленную версию его расширения с использованием
swift3
синтаксиса.Я не использую
parse
метод, но если кому-то понадобится, я обновлю этот пост.источник
Мне часто нужно комбинировать значения даты из одного места со значениями времени для другого. Я написал вспомогательную функцию для достижения этой цели.
источник
Согласно руководству по форматированию данных Apple
И хотя я согласен с @Leon, что это должен быть неудачный инициализатор, когда вы вводите начальные данные, у нас может быть тот, который не является неисправным (как и есть
UIImage(imageLiteralResourceName:)
).Итак, вот мой подход:
А теперь наслаждайтесь простым звонком:
источник