Convertir la chaîne en date dans Swift


Réponses:


231
  • Convertir la chaîne ISO8601 en date

    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)!
  • Obtenez les composants de date pour l'année, le mois, le jour et l'heure à partir de la date

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
  • Enfin, créez un nouvel Dateobjet et dépouillez les minutes et les secondes

    let finalDate = calendar.date(from:components)

Considérez également le formateur pratique ISO8601DateFormatterintroduit dans iOS 10 / macOS 12:

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

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

3
le Z dans "aaaa-MM-jj'T'HH: mm: ssZ" a résolu ce qui ne fonctionnait pas pour moi
asheyla

Je veux juste l'année mois et jour, mais cela ne fonctionne pas pour moi
Sneha

@Sneha Si vous ne voulez pas l'heure omettez simplement.hour
vadian

@vadian je l'ai fait mais je ne reçois pas
Sneha

1
Tout en un: ISO8601DateFormatter (). Date (from: "your string")!
Mike Irving

38

Essayez le format de date suivant.

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

J'espère que ça aide..

Swift 4.1:

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

10
Je l'ai essayé, et la date est revenue nulle après cela.
asheyla

1
Impossible de convertir la valeur de type 'Chaîne' en type 'Date' par contrainte
Oleksandr

22

Dans Swift 4.1, vous pouvez faire:

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

Salut, vous avez un format T séparé, puis convertissez comme vous le souhaitez

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

Juste votre passage dateformateet votre date alors vous obtenez Year,month,day,hour. Informaitons supplémentaires

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
    }


Obtenir l'année

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


Obtenir le mois

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


Get Day

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


Obtenir l'heure

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

4

rendre la fonction 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!)
}

Fonction appelée et y passer la valeur

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

et voici la sortie

Feb 25 2020 4:51 PM



 

1
Pensez-vous que votre entrée et votre sortie sont les mêmes?
Deepak Carpenter le

2

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

// sortie: - 30 mars 2019 17h30


2

juste Étape 1> obtenir la valeur String de JSON ou dataSource

Étape 2> créez une variable locale et affectez-la.

let startDate = CurrentDashBoard.startdate

Étape 3> Créez une instance de DateFormatter.

let dateFormatter = DateFormatter()

étape 4> appelez dateFormat à partir de dateFormatter et fournissez le type de données de date enregistré.

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

étape 5> Attribuez la variable locale à cette variable à convertir.

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

Étape 6> Fournissez votre date requise Formatez par le code suivant.

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

Étape 6> Attribuez-le à l'étiquette / au texte

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

Code:

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. Pour voir SI UNE DATE EST PASSÉE:

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

Je devenais fou avec ce format aussi.

Voir la solution ci-dessous.

Votre String qui vient de votre dos ou d'une autre source:

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

Identifiez le format de la date

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

Maintenant que vous avez la date comme Date (), vous pouvez changer le format de votre choix en utilisant le formatDate.string

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

Production:

    06/05/2020 20:00

0

Veuillez utiliser une bibliothèque d'analyse ISO8601 pour ce faire. Il y a trop de façons de coder la chaîne. Ne vous fiez pas à un format spécifique et ne comptez pas sur le serveur qui envoie toujours le même. Les problèmes commencent avec le «Z» à la fin et cela s'étendra à toutes les variétés de la norme. Une bibliothèque d'analyse gérera tous les cas et fournira toujours une conversion sûre - alors qu'une chaîne de mise en forme fixe est susceptible d'échouer à l'avenir.

Vous pouvez utiliser l'une de ces bibliothèques. Ils sont également disponibles sur CococaPods:

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

https://github.com/malcommac/SwiftDate

Jetez un œil aux implémentations. Ils font tous les deux plusieurs centaines de lignes - pour une bonne raison.

En ce qui concerne la question: vous pouvez extraire les composants de date de la date en utilisant NSDateComponents. L'exemple sur le site Web couvre exactement votre cas.

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

Veuillez noter que la conversion de votre date prendra en compte le fuseau horaire. Vous souhaiterez peut-être définir explicitement les paramètres régionaux de NSCalendar.


0

Utilisez simplement SwifterSwift.

stringDate = "2020-04-26T08:56:17.987Z"
let date = Date(iso8601String: stringDate)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.