¿Cómo puedo convertir la fecha de cadena a NSDate?


195

Quiero convertir "2014-07-15 06: 55: 14.198000 + 00: 00" esta fecha de cadena a NSDate en Swift.


Parece que su cadena "2014-07-15 06: 55: 14.198000 + 00: 00" no es accesible si usa NSDateFormatter
Alex Peda


Como recurso complementario a todas las respuestas a continuación, recomiendo visitar nsdateformatter.com
user3344977 del

Las viejas respuestas aquí son realmente INCORRECTAS . El doco de Apple dice que está claro que necesitas almacenar en caché el formateador. stackoverflow.com/a/42370648/294884
Fattie

Si necesita ayuda con el formato, nsdateformatter.com
Pedro Luz

Respuestas:


341

prueba esto:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = /* find out and place date format from 
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
let date = dateFormatter.dateFromString(/* your_date_string */)

Para consultas adicionales, verifique las clases NSDateFormatter y DateFormatter de Foundation Framework para Objective-C y Swift, respectivamente.

Swift 3 y posterior (Swift 4 incluido)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = /* date_format_you_want_in_string from
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
guard let date = dateFormatter.date(from: /* your_date_string */) else {
   fatalError("ERROR: Date conversion failed due to mismatched format.")
}

// use date constant here

11
Encontré que la solución solo necesita establecer "aaaa-MM-dd hh: mm: ss.SSSSxxx" este formato de fecha
Shardul

1
Tengo una cadena de fecha como esta "2014-07-15 06: 55: 14-0400" e intenté usarla yyyy-MM-dd hh:mm:ssZZZ. Pero no puedo sacar el objeto de fecha de la cadena.
iamprem

2
@Prem, si ve que la salida es "2014-07-15 10:55:14 +0000"correcta. A partir de la NSDatedescripción, el resultado de la fecha se calcularía con diferencia (aquí, GMT -4 horas). Si desea obtener la diferencia entre GMT y UTC, -0400consulte esta referencia
x4h1d

@ x4h1d, ¡Hola, lo tengo! Cometí un error en el hhque debería estar HH. ¡Gracias!
iamprem

3
@ lmiguelvargasf, creo que sería así yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Asumí que Zes solo un personaje aquí. Recuerde, también Ztiene un significado especial. Si desea Zespecificar como basic hmssería el formato yyyy-MM-dd'T'HH:mm:ss.SSSZ.
x4h1d

71

Swift 4

import Foundation

let dateString = "2014-07-15" // change to your date format

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

let date = dateFormatter.date(from: dateString)
println(date)

Swift 3

import Foundation

var dateString = "2014-07-15" // change to your date format

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

var date = dateFormatter.dateFromString(dateString)
println(date)

Puedo hacerlo con este código.


55
El código no es correcto. Emite algo "15 de enero de 2014, 12:00 a.m."
Jake Lin

55
usar en ddlugar de DDdebería ayudar a solucionar el problema de "siempre enero".
Pascal Belloncle

1
La versión correcta es, de lo yyyy-MM-ddcontrario, la fecha analizada se atasca en enero: actualicé la respuesta para reflejar el cambio.
Zorayr

¿Qué pasa si quiero pasar la fecha actual como cadena? esto funcionara?
Arjun Kalidas el

@Zorayr, Kittisak: Estoy recibiendo la salida, Opcional (2014-07-14 18:30:00 +0000) eso significa que un día está decrementado. Cómo puedo arreglar esto ?
Vineesh TP

54
 func convertDateFormatter(date: String) -> String
 {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let date = dateFormatter.dateFromString(date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let timeStamp = dateFormatter.stringFromDate(date!)


    return timeStamp
}

Actualizado para Swift 3.

func convertDateFormatter(date: String) -> String
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let date = dateFormatter.date(from: date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: date!)


    return timeStamp
}

17

Detalles

  • Swift 4, Xcode 9.2
  • Swift 5, Xcode 10.2 (10E125)

Solución

import Foundation

extension DateFormatter {

    convenience init (format: String) {
        self.init()
        dateFormat = format
        locale = Locale.current
    }
}

extension String {

    func toDate (dateFormatter: DateFormatter) -> Date? {
        return dateFormatter.date(from: self)
    }

    func toDateString (dateFormatter: DateFormatter, outputFormat: String) -> String? {
        guard let date = toDate(dateFormatter: dateFormatter) else { return nil }
        return DateFormatter(format: outputFormat).string(from: date)
    }
}

extension Date {

    func toString (dateFormatter: DateFormatter) -> String? {
        return dateFormatter.string(from: self)
    }
}

Uso

var dateString = "14.01.2017T14:54:00"
let dateFormatter = DateFormatter(format: "dd.MM.yyyy'T'HH:mm:ss")
let date = Date()

print("original String with date:               \(dateString)")
print("date String() to Date():                 \(dateString.toDate(dateFormatter: dateFormatter)!)")
print("date String() to formated date String(): \(dateString.toDateString(dateFormatter: dateFormatter, outputFormat: "dd MMMM")!)")
let dateFormatter2 = DateFormatter(format: "dd MMM HH:mm")
print("format Date():                           \(date.toString(dateFormatter: dateFormatter2)!)")

Resultado

ingrese la descripción de la imagen aquí

Más información

Sobre formato de fecha


15

Si va a necesitar analizar la cadena en una fecha con frecuencia, es posible que desee mover la funcionalidad a una extensión. Creé un archivo sharedCode.swift y puse mis extensiones allí:

extension String
{   
    func toDateTime() -> NSDate
    {
        //Create Date Formatter
        let dateFormatter = NSDateFormatter()

        //Specify Format of String to Parse
        dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss.SSSSxxx"

        //Parse into NSDate
        let dateFromString : NSDate = dateFormatter.dateFromString(self)!

        //Return Parsed Date
        return dateFromString
    }
}

Luego, si desea convertir su cadena en un NSDate, puede escribir algo como:

var myDate = myDateString.toDateTime()

1
Gracias. También es posible, aunque menos útil, escribir: var myDate = "04-05-2015" .toDateTime () Me pareció útil al configurar los datos de prueba.
Stephen Watson el

1
Estoy bastante seguro de que hhdebería ser HHen este caso.
Alex

Esto no me da en el formato que especifico: var date = NSDate (); let dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, AAAA"; deje myDate = dateFormatter.stringFromDate (fecha); Y además de esto si uso su extensión de esta manera -> var myDate2 = myDate.toDateTime (); Me está dando una fecha completamente diferente y no la fecha actual.
Arjun Kalidas el

9

Para Swift 3

func stringToDate(_ str: String)->Date{
    let formatter = DateFormatter()
    formatter.dateFormat="yyyy-MM-dd hh:mm:ss Z"
    return formatter.date(from: str)!
}
func dateToString(_ str: Date)->String{
    var dateFormatter = DateFormatter()
    dateFormatter.timeStyle=DateFormatter.Style.short
    return dateFormatter.string(from: str)
}

5

Los fragmentos de código en esta página de control de calidad están "al revés" ...

Lo primero que Apple menciona es que guardas en caché tu formateador ...

Enlace al documento de Apple que indica exactamente cómo hacer esto:

Formateadores de caché para eficiencia Crear un formateador de fecha no es una operación barata. ... caché de una sola instancia ...

Utilice un global ...

let df : DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter 
}()

Luego, simplemente use ese formateador en cualquier lugar ...

let s = df.string(from: someDate)

o

let d = df.date(from: someString)

O use cualquiera de los muchos métodos convenientes en DateFormatter.

Es así de simple.

(Si escribe una extensión en String, su código está completamente "al revés" - ¡no puede usar ninguna llamada dateFormatter!)

Tenga en cuenta que generalmente tendrá algunos de esos globales .. como "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" ... etc.


No es necesario dejarlos en el ámbito global. Puede extender Formatter simplemente declarando sus propiedades estáticas. mira
Leo Dabus

4

Extensiones de apoyo Swift, la extensión se puede añadir una nueva funcionalidad a una ya existente class, structure, enumeration, o protocoltipo.

Puede agregar una nueva initfunción al NSDateobjeto extendiendo el objeto usando la extensionpalabra clave.

extension NSDate
{
    convenience
    init(dateString:String) {
        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyyMMdd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "fr_CH_POSIX")
        let d = dateStringFormatter.dateFromString(dateString)!
        self.init(timeInterval:0, sinceDate:d)
    }
} 

Ahora puede iniciar un objeto NSDate usando:

let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")

Me gusta la forma init. ¿No hay otra forma de crear la fecha sin usar timeInterval? ¿Qué pasa si nsdate deja de tener un inicializador con un parámetro de fecha? ¿Cómo lo resolverías? Personalmente, prefiero una forma de inicio, pero no sé cómo superar este problema
Mijail

Tengo un problema: mi fecha como cadena es así: "2017-03-10 22:16:00 +0000" y utilicé este formato: "aaaa-MM-dd hh: mm: ss Z" y este: "aaaa-MM-dd'T'HH: mm: ss". Pero para ambos, cuando hago esto: let beginDate = df.date(from: beginDateString), ¡obtengo un cero! ¿por qué? ( df = DateFormatter())
Paul Bénéteau

4

Desde Swift 3, muchos de los prefijos NS se han eliminado.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
/* date format string rules
 * http://userguide.icu-project.org/formatparse/datetime
 */

let date = dateFormatter.date(from: dateString)

Tengo un problema: mi fecha como cadena es así: "2017-03-10 22:16:00 +0000" y utilicé este formato: "aaaa-MM-dd hh: mm: ss Z" y este: "aaaa-MM-dd'T'HH: mm: ss". Pero para ambos, cuando hago esto: let beginDate = df.date(from: beginDateString), ¡obtengo un cero! ¿por qué? ( df = DateFormatter())
Paul Bénéteau

4

Swift 3,4:

2 conversiones útiles:

string(from: Date) // to convert from Date to a String
date(from: String) // to convert from String to Date

Uso: 1.

let date = Date() //gives today's date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"
let todaysDateInUKFormat = dateFormatter.string(from: date)

2)

 let someDateInString = "23.06.2017"
 var getDateFromString = dateFormatter.date(from: someDateInString)

3

PARA SWIFT 3.1

func convertDateStringToDate(longDate: String) -> String{

    /* INPUT: longDate = "2017-01-27T05:00:00.000Z"
     * OUTPUT: "1/26/17"
     * date_format_you_want_in_string from
     * http://userguide.icu-project.org/formatparse/datetime
     */

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let date = dateFormatter.date(from: longDate)

    if date != nil {

        let formatter = DateFormatter()
        formatter.dateStyle = .short
        let dateShort = formatter.string(from: date!)

        return dateShort

    } else {

        return longDate

    }
}

NOTA: ESTO DEVOLVERÁ LA CADENA ORIGINAL SI ERROR


2

Para agregar una cadena dentro del formato de fecha en Swift, hice esto

 var dataFormatter:NSDateFormatter = NSDateFormatter()
                dataFormatter.dateFormat = "dd-MMMM 'at' HH:mm a"

cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)

2

Este trabajo para mi ..

    import Foundation
    import UIKit

    //dateString = "01/07/2017"
    private func parseDate(_ dateStr: String) -> String {
            let simpleDateFormat = DateFormatter()
            simpleDateFormat.dateFormat = "dd/MM/yyyy" //format our date String
            let dateFormat = DateFormatter()
            dateFormat.dateFormat = "dd 'de' MMMM 'de' yyyy" //format return

            let date = simpleDateFormat.date(from: dateStr)
            return dateFormat.string(from: date!)
    }

1

A continuación se muestran algunas opciones de conversión de formato de cadena a fecha en iOS rápido.

  1. Thursday, Dec 27, 2018 formato = EEEE, MMM d, yyyy
  2. 12/27/2018 formato = MM/dd/yyyy
  3. 12-27-2018 09:59 formato = MM-dd-yyyy HH:mm
  4. Dec 27, 9:59 AM formato = MMM d, h:mm a
  5. December 2018 formato = MMMM yyyy
  6. Dec 27, 2018 formato = MMM d, yyyy
  7. Thu, 27 Dec 2018 09:59:19 +0000 formato = E, d MMM yyyy HH:mm:ss Z
  8. 2018-12-27T09:59:19+0000 formato = yyyy-MM-dd'T'HH:mm:ssZ
  9. 27.12.18 formato = dd.MM.yy
  10. 09:59:19.815 formato = HH:mm:ss.SSS

0
Swift: iOS
if we have string, convert it to NSDate,

var dataString = profileValue["dob"] as String
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"

// convert string into date
let dateValue:NSDate? = dateFormatter.dateFromString(dataString)

if you have and date picker parse date like this

// to avoid any nil value
if let isDate = dateValue {
self.datePicker.date = isDate
}

0

Puedes probar este código rápido

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"//same as strDate date formator
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00")//Must used if you get one day less in conversion
    let convertedDateObject = dateFormatter.date(from: strDate)

0

SWIFT 5 , Xcode 11.0

Pase su (fecha en cadena) en "dateString" y en el formato de pase "dateFormat" que desee. Para elegir el formato, use el sitio web NDateFormatter .

func getDateFrom(dateString: String, dateFormat: String) -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat
    dateFormatter.locale = Locale(identifier: "en_US")
    guard let date = dateFormatter.date(from: dateString) else {return nil}
    return date
}

-3
import Foundation

let now : String = "2014-07-16 03:03:34 PDT"
var date : NSDate
var dateFormatter : NSDateFormatter

date = dateFormatter.dateFromString(now)

date // $R6: __NSDate = 2014-07-16 03:03:34 PDT

https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/doc/uid/20000447-SW32


2
¿Cómo se supone que esto funcione? El formateador de fecha no se inicializa y tampoco hay razón para dividir la declaración y la inicialización de la fecha.
Ixx
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.