¿Cómo se crea un objeto Date rápido?

¿Cómo se crea un objeto de fecha a partir de una fecha en xcode rápido?

por ejemplo, en javascript harías: var day = new Date('2014-05-20');

Swift tiene su propio tipo de Date . No es necesario usar NSDate .

Creando una fecha y hora en Swift

En Swift, las fechas y horas se almacenan en un número de coma flotante de 64 bits que mide el número de segundos desde la fecha de referencia del 1 de enero de 2001 a las 00:00:00 UTC . Esto se expresa en la estructura de Date . Lo siguiente le daría la fecha y hora actuales:

 let currentDateTime = Date() 

Para crear otros horarios, puede usar uno de los siguientes métodos.

Método 1

Si conoce la cantidad de segundos antes o después de la fecha de referencia de 2001, puede usar eso.

 let someDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM 

Método 2

Por supuesto, sería más fácil usar cosas como años, meses, días y horas (en lugar de segundos relativos) para hacer una Date . Para esto puede usar DateComponents para especificar los componentes y luego Calendar para crear la fecha. El Calendar proporciona el contexto de la Date . De lo contrario, ¿cómo sabría en qué zona horaria o calendario expresslo?

 // 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) 

Otras abreviaturas de zona horaria se pueden encontrar aquí . Si lo deja en blanco, el valor predeterminado es usar la zona horaria del usuario.

Método 3

La forma más concisa (pero no necesariamente la mejor) podría ser usar DateFormatter .

 let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd HH:mm" let someDateTime = formatter.date(from: "2016/10/08 22:31") 

Los estándares técnicos de Unicode muestran otros formatos compatibles con DateFormatter .

Notas

Vea mi respuesta completa para saber cómo mostrar la fecha y la hora en un formato legible. Lea también estos excelentes artículos:

  • Cómo trabajar con fechas y horas en Swift 3, parte 1: Fechas, calendarios y fechaComponentes
  • Cómo trabajar con fechas y horas en Swift 3, parte 2: DateFormatter
  • Cómo trabajar con fechas y horas en Swift 3, parte 3: Fecha aritmética

Esto se hace mejor usando una extensión a la clase NSDate existente.

La siguiente extensión agrega un nuevo inicializador que creará una fecha en la configuración regional actual usando la cadena de fecha en el formato que especificó.

 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) } } 

Ahora puede crear un NSDate de Swift simplemente haciendo:

 NSDate(dateString:"2014-06-06") 

Tenga en cuenta que esta implementación no almacena en caché el NSDateFormatter, lo cual es posible que desee hacer por razones de rendimiento si espera crear muchos NSDate de esta manera.

Tenga en cuenta también que esta implementación simplemente se bloqueará si intenta inicializar un NSDate al pasar una cadena que no se puede analizar correctamente. Esto se debe al desenrollamiento forzado del valor opcional devuelto por dateFromString . Si desea devolver un nil en análisis incorrectos, lo ideal sería utilizar un inicializador de error; pero no puede hacer eso ahora (junio de 2015), debido a una limitación en Swift 1.2, entonces la siguiente mejor opción es usar un método de fábrica de clase.

Un ejemplo más elaborado, que aborda ambos problemas, está aquí: https://gist.github.com/algal/09b08515460b7bd229fa .

Swift no tiene su propio tipo de fecha, pero puede utilizar el tipo de NSDate Cocoa existente, por ejemplo:

 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 } } 

Que puedes usar como:

 var date = Date.parse("2014-05-20") var date = Date.from(year: 2014, month: 05, day: 20) 

De acuerdo con la documentación de Apple

Ejemplo:

 var myObject = NSDate() let futureDate = myObject.dateByAddingTimeInterval(10) let timeSinceNow = myObject.timeIntervalSinceNow 

En, Swift 3.0, ha configurado el objeto de fecha para esta forma.

 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) } } 

De acuerdo con la respuesta de @mythz, decido publicar una versión actualizada de su extensión utilizando la syntax de 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) } } 

No uso el método de parse , pero si alguien necesita, actualizaré esta publicación.

A menudo tengo la necesidad de combinar valores de fecha de un lugar con valores de tiempo para otro. Escribí una función de ayudante para lograr esto.

 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)! 

Personalmente creo que debería ser un inicializador failable:

 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 } } } 

De lo contrario, una cadena con un formato no válido generará una excepción.