Converti la stringa in data in Swift


Risposte:


231
  • Convertire la stringa ISO8601 fino ad oggi

    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)!
  • Ottieni i componenti della data per anno, mese, giorno e ora dalla data

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
  • Infine, crea un nuovo Dateoggetto e togli i minuti e i secondi

    let finalDate = calendar.date(from:components)

Considera anche il pratico formatter ISO8601DateFormatterintrodotto in iOS 10 / macOS 12:

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

let dateFormatter = ISO8601DateFormatter()
let date = dateFormatter.date(from:isoDate)!

3
la Z in "yyyy-MM-dd'T'HH: mm: ssZ" risolto ciò che non funzionava per me
asheyla,

Voglio solo anno, mese e giorno, ma questo non funziona per me
Sneha,

@Sneha Se non vuoi che l'ora ometta.hour
vadian

@vadian L'ho fatto, ma non ci arrivo
Sneha

1
Tutto in uno: ISO8601DateFormatter (). Date (from: "your string")!
Mike Irving,

38

Prova il seguente formato data.

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

Spero che sia d'aiuto..

Swift 4.1:

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

10
Ho provato, e la data restituisce zero dopo questo.
asheyla,

1
Impossibile convertire il valore di tipo "String" in tipo "Date" in coercizione
Oleksandr,

22

In Swift 4.1 puoi fare:

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
}

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

9

Ciao Hai un formato T separato e poi converti come preferisci

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

6

Passerai solo il tuo dateformatee il tuo appuntamento Year,month,day,hour. Informazioni 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
    }


Ottieni l'anno

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


Ottieni il mese

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


Ottieni il giorno

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


Ottieni ora

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

4

rendere la funzione globale

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

Chiamata funzione e passa valore in essa

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

e qui viene prodotto

Feb 25 2020 4:51 PM



 

1
Pensi che i tuoi input e output siano gli stessi?
Deepak Carpenter il

2

In 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_)

// uscita: - 30 marzo 2019 17:30


2

basta passare 1> ottenere il valore String da JSON o dataSource

Passaggio 2> creare una variabile locale e assegnarla.

let startDate = CurrentDashBoard.startdate

Passaggio 3: creare un'istanza di DateFormatter.

let dateFormatter = DateFormatter()

passaggio 4> chiama dateFormat da dateFormatter e fornisci dataType data salvata.

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

passaggio 5> Assegna la variabile locale a questa variabile da convertire.

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

Passaggio 6> fornire la data richiesta Formattare con il seguente codice.

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

Passaggio 6> Assegnalo a etichetta / testo

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

Codice:

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)

1

Swift 5. Per vedere SE UNA DATA È PASSATA:

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

1

Stavo impazzendo anche con questo formato.

Vedi la soluzione di seguito.

La tua stringa che proveniva dalla tua schiena o da un'altra fonte:

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

Identifica il formato della data

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

Ora che hai la data come Date () puoi cambiare il formato che vuoi usando formatDate.string

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

Produzione:

    06/05/2020 20:00

0

A tale scopo, utilizzare una libreria di analisi ISO8601. Esistono troppi modi per codificare la stringa. Non fare affidamento su un formato specifico e non fare affidamento sul fatto che il server invii sempre lo stesso. I problemi iniziano con la "Z" alla fine e si estenderà attraverso tutte le varietà dello standard. Una libreria di analisi gestirà tutti i casi e fornirà sempre una conversione sicura, mentre una stringa di formattazione fissa potrebbe non riuscire in futuro.

È possibile utilizzare una di queste librerie. Sono disponibili anche su CococaPods:

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

https://github.com/malcommac/SwiftDate

Dai un'occhiata alle implementazioni. Sono lunghe diverse centinaia di righe, per una buona ragione.

Per quanto riguarda la domanda: è possibile estrarre i componenti della data dalla data utilizzando NSDateComponents. L'esempio sul sito Web copre esattamente il tuo caso.

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

Tieni presente che la conversione della data terrà conto del fuso orario. Si consiglia di impostare in modo esplicito la "locale" di NSCalendar.


0

Usa SwifterSwift.

stringDate = "2020-04-26T08:56:17.987Z"
let date = Date(iso8601String: stringDate)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.