Как создать объект swift Date
Как создать объект даты из даты в swift xcode.
например, в javascript вы бы сделали:
var day = new Date('2014-05-20');
8 ответов:
Swift имеет свой собственный тег
Dateтип. Не нужно использоватьNSDate.создание даты и времени в Swift
в Swift даты и время хранятся в 64-битном числе с плавающей запятой, измеряющем количество секунд с контрольной даты 1 января 2001 года в 00: 00: 00 UTC. Это выражается в
Dateструктура. Следующие даст вам текущую дату и время:let currentDateTime = Date()для создавая другие даты-времена, вы можете использовать один из следующих методов.
Способ 1
если вы знаете количество секунд до или после контрольной даты 2001 года, вы можете использовать это.
let someDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AMСпособ 2
конечно, было бы проще использовать такие вещи, как годы, месяцы, дни и часы (а не относительные секунды), чтобы сделать
Date. Для этого вы можете использоватьDateComponentsуказать компоненты, а затемCalendarсоздать датой. ЭлементCalendarдаетDateконтексте. В противном случае, как бы он знал, в каком часовом поясе или календаре его выразить?// Specify date components var dateComponents = DateComponents() dateComponents.year = 1980 dateComponents.month = 7 dateComponents.day = 11 dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time dateComponents.hour = 8 dateComponents.minute = 34 // Create date from components let userCalendar = Calendar.current // user calendar let 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")в технические стандарты Unicode показывают другие форматы это
DateFormatterподдерживает.Примечания
посмотреть мой полный ответ для отображения даты и времени в удобном для чтения формате. Также читайте эти отличные статьи:
это лучше всего сделать с помощью расширения к существующему
NSDateкласса.следующее расширение добавляет новый инициализатор, который создаст дату в текущей локали, используя строку даты в указанном формате.
extension NSDate { convenience init(dateString:String) { let dateStringFormatter = NSDateFormatter() dateStringFormatter.dateFormat = "yyyy-MM-dd" dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") let d = dateStringFormatter.dateFromString(dateString)! self.init(timeInterval:0, sinceDate:d) } }теперь вы можете создать NSDate из Swift, просто выполнив:
NSDate(dateString:"2014-06-06")обратите внимание, что эта реализация не кэширует NSDateFormatter, что вы можете сделать по соображениям производительности, если вы ожидаете быть создание многих
NSDates таким образом.пожалуйста, Также обратите внимание, что эта реализация просто рухнет, если вы попытаетесь инициализировать
NSDateпутем передачи строки, которая не может быть правильно проанализирована. Это происходит из-за принудительного разворачивания необязательного значения, возвращаемогоdateFromString. Если вы хотите вернутьnilна плохих разборах, вы бы идеально использовать отказоустойчивый инициализатор; но вы не можете сделать это сейчас (июнь 2015), из-за ограничения в Swift 1.2, так что вы следующий лучший выбор чтобы использовать метод фабрики класса.более подробный пример, который касается обеих проблем, находится здесь:https://gist.github.com/algal/09b08515460b7bd229fa .
Swift не имеет своего собственного типа даты, но вы можете использовать существующий Cocoa
NSDateтип, например:class Date { class func from(year: Int, month: Int, day: Int) -> Date { let gregorianCalendar = NSCalendar(calendarIdentifier: .gregorian)! var dateComponents = DateComponents() dateComponents.year = year dateComponents.month = month dateComponents.day = day let date = gregorianCalendar.date(from: dateComponents)! return date } class func parse(_ string: String, format: String = "yyyy-MM-dd") -> Date { let dateFormatter = DateFormatter() dateFormatter.timeZone = NSTimeZone.default dateFormatter.dateFormat = format let date = dateFormatter.date(from: string)! return date } }который вы можете использовать, как:
var date = Date.parse("2014-05-20") var date = Date.from(year: 2014, month: 05, day: 20)
по данным документация Apple
пример :
var myObject = NSDate() let futureDate = myObject.dateByAddingTimeInterval(10) let timeSinceNow = myObject.timeIntervalSinceNow
In, Swift 3.0 вы установили объект даты для этого способа.
extension Date { init(dateString:String) { let dateStringFormatter = DateFormatter() dateStringFormatter.dateFormat = "yyyy-MM-dd" dateStringFormatter.locale = Locale(identifier: "en_US_POSIX") let d = dateStringFormatter.date(from: dateString)! self(timeInterval:0, since:d) } }
лично я думаю, что это должен быть неудачный инициализатор:
extension Date { init?(dateString: String) { let dateStringFormatter = DateFormatter() dateStringFormatter.dateFormat = "yyyy-MM-dd" if let d = dateStringFormatter.date(from: dateString) { self.init(timeInterval: 0, since: d) } else { return nil } } }в противном случае строка с недопустимым форматом вызовет исключение.
согласно ответу @mythz, я решаю опубликовать обновленную версию своего расширения с помощью
swift3синтаксис.extension Date { static func from(_ year: Int, _ month: Int, _ day: Int) -> Date? { let gregorianCalendar = Calendar(identifier: .gregorian) let dateComponents = DateComponents(calendar: gregorianCalendar, year: year, month: month, day: day) return gregorianCalendar.date(from: dateComponents) } }Я не использую
parseметод, но если кто-то нуждается, я буду обновлять этот пост.
Мне часто приходится комбинировать значения даты из одного места со значениями времени для другого. Для этого я написал вспомогательную функцию.
let startDateTimeComponents = NSDateComponents() startDateTimeComponents.year = NSCalendar.currentCalendar().components(NSCalendarUnit.Year, fromDate: date).year startDateTimeComponents.month = NSCalendar.currentCalendar().components(NSCalendarUnit.Month, fromDate: date).month startDateTimeComponents.day = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: date).day startDateTimeComponents.hour = NSCalendar.currentCalendar().components(NSCalendarUnit.Hour, fromDate: time).hour startDateTimeComponents.minute = NSCalendar.currentCalendar().components(NSCalendarUnit.Minute, fromDate: time).minute let startDateCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian) combinedDateTime = startDateCalendar!.dateFromComponents(startDateTimeComponents)!