Convertir cadena a fecha en Swift

136

¿Cómo puedo convertir esta cadena "2016-04-14T10:44:00+0000"en una NSDatey mantener solo el año, mes, día y hora?

En Tel medio de esto, realmente arroja lo que estoy acostumbrado cuando trabajo con fechas.

asheyla
fuente
Solo quieres año, mes, día, hora, ¿verdad?
Mitul Marsoniya
Posible duplicado de From String a NSDate en Swift
Fogmeister el

Respuestas:

231
  • Convierta la cadena ISO8601 a la fecha

    let isoDate = "2016-04-14T10:44:00+0000"
    
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!
  • Obtenga los componentes de fecha para año, mes, día y hora a partir de la fecha

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
  • Finalmente crea un nuevo Dateobjeto y tira minutos y segundos

    let finalDate = calendar.date(from:components)

Considere también el formateador de conveniencia ISO8601DateFormatterintroducido en iOS 10 / macOS 12:

let isoDate = "2016-04-14T10:44:00+0000"

let dateFormatter = ISO8601DateFormatter()
let date = dateFormatter.date(from:isoDate)!
vadian
fuente
3
la Z en "aaaa-MM-dd'T'HH: mm: ssZ" resolvió lo que no funcionaba para mí
asheyla
Solo quiero año, mes y día, pero esto no funciona para mí
Sneha
@Sneha Si no quieres la hora, solo omite.hour
vadian
@vadian lo hice pero no lo estoy recibiendo
Sneha
1
¡Todo en uno: ISO8601DateFormatter (). Date (de: "su cadena")!
Mike Irving
38

Pruebe el siguiente formato de fecha.

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter. dateFromString (strDate)

Espero eso ayude..

Swift 4.1:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter.date(from: strDate)
Balaji Ramakrishnan
fuente
10
Lo probé, y la fecha volvió nula después de esto.
asheyla
1
No se puede convertir el valor del tipo 'Cadena' al tipo 'Fecha' en coerción
Oleksandr
22

En Swift 4.1 puedes hacer:

func getDate() -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.locale = Locale.current
    return dateFormatter.date(from: "2015-04-01T11:42:00") // replace Date String
}
Paul Spiesberger
fuente
16

Swift 3.0 - 4.2

import Foundation

extension String {

    func toDate(withFormat format: String = "yyyy-MM-dd HH:mm:ss")-> Date?{

        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.calendar = Calendar(identifier: .gregorian)
        dateFormatter.dateFormat = format
        let date = dateFormatter.date(from: self)

        return date

    }
}

extension Date {

    func toString(withFormat format: String = "EEEE ، d MMMM yyyy") -> String {

        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.calendar = Calendar(identifier: .persian)
        dateFormatter.dateFormat = format
        let str = dateFormatter.string(from: self)

        return str
    }
}
Mohammad Razipour
fuente
9

Hola, tiene un formato T separado y luego convierte como desee

// create dateFormatter with UTC time format
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date = dateFormatter.dateFromString("2015-04-01T11:42:00")

// change to a readable time format and change to local time zone
dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a"
dateFormatter.timeZone = NSTimeZone.localTimeZone() 
let timeStamp = dateFormatter.stringFromDate(date!)
Arun
fuente
6

Solo estás pasando tu dateformatey tu fecha y luego obtienes Year,month,day,hour. Información extra

func GetOnlyDateMonthYearFromFullDate(currentDateFormate:NSString , conVertFormate:NSString , convertDate:NSString ) -> NSString
    {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = currentDateFormate as String
        let formatter = NSDateFormatter()
        formatter.dateFormat = Key_DATE_FORMATE as String
        let finalDate = formatter.dateFromString(convertDate as String)
        formatter.dateFormat = conVertFormate as String
        let dateString = formatter.stringFromDate(finalDate!)

        return dateString
    }


Obtener año

let Year = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "YYYY", convertDate: "2016-04-14T10:44:00+0000") as String


Obtener mes

let month = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "MM", convertDate: "2016-04-14T10:44:00+0000") as String


Obtener el día

let day = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "dd", convertDate: "2016-04-14T10:44:00+0000") as String


Obtener hora

let hour  = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "hh", convertDate: "2016-04-14T10:44:00+0000") as String
Mitul Marsoniya
fuente
4

hacer una función global

func convertDateFormat(inputDate: String) -> String {

     let olDateFormatter = DateFormatter()
     olDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

     let oldDate = olDateFormatter.date(from: inputDate)

     let convertDateFormatter = DateFormatter()
     convertDateFormatter.dateFormat = "MMM dd yyyy h:mm a"

     return convertDateFormatter.string(from: oldDate!)
}

Función llamada y valor de paso en ella

get_OutputStr = convertDateFormat(inputDate: "2019-03-30T05:30:00+0000")

y aquí está la salida

Feb 25 2020 4:51 PM



 
Narendra Jagne
fuente
1
¿Crees que tu entrada y salida son las mismas?
Deepak Carpenter
2

En swift4,

    var Msg_Date_ = "2019-03-30T05:30:00+0000"

    let dateFormatterGet = DateFormatter()
    dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    let dateFormatterPrint = DateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd yyyy h:mm a"  //"MMM d, h:mm a" for  Sep 12, 2:11 PM
    let datee = dateFormatterGet.date(from: Msg_Date_)
    Msg_Date_ =  dateFormatterPrint.string(from: datee ?? Date())

    print(Msg_Date_)

// salida: - 30 mar 2019 05:30 PM

Fuhad Saneen
fuente
2

solo el paso 1> obtenga el valor de cadena de JSON o dataSource

Paso 2> crea una variable local y asígnela.

let startDate = CurrentDashBoard.startdate

Paso 3> crea una instancia de DateFormatter.

let dateFormatter = DateFormatter()

paso 4> llama al dateFormat desde dateFormatter y proporciona el tipo de datos de fecha guardado.

dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss"("may be String formate")

paso 5> Asigna la variable Local a esta variable para convertir.

let dateFromStringstartDate : NSDate = dateFormatter.date(from: startDate)! as NSDate

Paso 6> proporcione el formato de fecha requerido con el siguiente código.

dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"

Paso 6> Asignarlo a etiqueta / texto

cell.lblStartDate.text = String(format: "%@", strstartDate)

Código:

let startDate = CurrentDashBoard.startdate let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss" let dateFromStringstartDate : 
NSDate = dateFormatter.date(from: startDate)! as NSDate
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"
let strstartDate = dateFormatter.string(from: dateFromStringstartDate as Date)
Akshay K
fuente
1

Swift 5. Para ver SI HA PASADO UNA FECHA:

let expiryDate = "2020-01-10" // Jan 10 2020

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

if Date() < dateFormatter.date(from: expiryDate) ?? Date() {
    print("Not Yet expiryDate")
} else {
    print("expiryDate has passed")
}
Thyselius
fuente
1

Me estaba volviendo loco con este formato también.

Vea la solución a continuación.

Su cadena que vino de su espalda u otra fuente:

    let isoDate = "2020-05-06 20:00:00-03"

Identifica el formato de fecha

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!

Ahora que tiene la fecha como Fecha (), puede cambiar el formato que desee utilizando formatDate.string

    let formatDate = DateFormatter()
    formatDate.dateFormat = "dd/MM/yyyy HH:mm"
    let drawDate = formatDate.string(from: date)
    print(drawDate)

Salida:

    06/05/2020 20:00
Alan Silva
fuente
0

Utilice una biblioteca de análisis ISO8601 para hacer esto. Hay muchas formas de codificar la cadena. No confíe en un formato específico y no confíe en que el servidor envíe siempre lo mismo. Los problemas comienzan con la 'Z' al final y se extenderá a todas las variedades del estándar. Una biblioteca de análisis manejará todos los casos y siempre proporcionará una conversión segura, mientras que es probable que una cadena de formato fija falle en el futuro.

Podrías usar una de estas bibliotecas. También están disponibles en CococaPods:

https://github.com/boredzo/iso-8601-date-formatter/

https://github.com/malcommac/SwiftDate

Echa un vistazo a las implementaciones. Ambos tienen varios cientos de líneas de largo, por una buena razón.

Con respecto a la pregunta: puede extraer los componentes de la fecha de la fecha utilizando NSDateComponents. El ejemplo en el sitio web cubre exactamente su caso.

https://developer.apple.com/documentation/foundation/nscalendar/1414841-components?language=objc

Tenga en cuenta que la conversión de su fecha tendrá en cuenta la zona horaria. Es posible que desee establecer la 'configuración regional' de NSCalendar explícitamente.

thetrutz
fuente
0

Solo usa SwifterSwift.

stringDate = "2020-04-26T08:56:17.987Z"
let date = Date(iso8601String: stringDate)
LeoNard
fuente