Как создать объект 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, что вы можете сделать по соображениям производительности, если вы ожидаете быть создание многих
NSDate
s таким образом.пожалуйста, Также обратите внимание, что эта реализация просто рухнет, если вы попытаетесь инициализировать
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)!