Format de date dans Swift


150

Comment vais-je convertir cette date / heure à partir de la date?

De ceci: 2016-02-29 12:24:26
au: 29 février 2016

Jusqu'à présent, c'est mon code et il renvoie une valeur nulle:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date: NSDate? = dateFormatter.dateFromString("2016-02-29 12:24:26")
print(date)

Réponses:


267

Vous devez déclarer 2 différents NSDateFormatters, le premier pour convertir la chaîne en a NSDateet le second pour imprimer la date dans votre format.
Essayez ce code:

let dateFormatterGet = NSDateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"

let dateFormatterPrint = NSDateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"

let date: NSDate? = dateFormatterGet.dateFromString("2016-02-29 12:24:26")
print(dateFormatterPrint.stringFromDate(date!))

Swift 3 et supérieur:

Depuis Swift 3, la NSDateclasse a été changée en Dateet NSDateFormatteren DateFormatter.

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

let dateFormatterPrint = DateFormatter()
dateFormatterPrint.dateFormat = "MMM dd,yyyy"

if let date = dateFormatterGet.date(from: "2016-02-29 12:24:26") {
    print(dateFormatterPrint.string(from: date))
} else {
   print("There was an error decoding the string")
}

1
Que se passe-t-il si dateFormatterGet dateFormat doit accepter 2 formats différents - un contenant des millisecondes et un sans millisecondes? c.-à-d. aaaa-MM-jj'T'HH: mm: ssZZZZZ et aaaa-MM-jj'T'HH: mm: ss: SSSZZZZZ
KvnH

1
Je pense que vous devez déclarer deux DateFormatters différents pour obtenir la date: si le premier échoue (il retournera nil), utilisez le second.
LorenzOliveto

Pouvez-vous s'il vous plaît m'aider, quel sera le format de date pour "Tue Mar 12 2019 12:00:00 GMT-0500 (CDT)"
Devesh

@Devesh cela devrait être quelque chose comme ceci "EEE MMM j aaaa HH: mm: ss ZZZZ", consultez nsdateformatter.com c'est un site très amusant avec tous les formats pris en charge
LorenzOliveto

@lorenzoliveto oui j'ai essayé tout le chemin pour ce format j'ai essayé sur nsdateformatter.com aussi, encore, je ne suis pas en mesure d'obtenir quoi que ce soit pour "Tue Mar 12 2019 12:00:00 GMT-0500 (CDT)" ce format. J'obtiens ce format dans un JSON. Je ne suis pas sûr que cette chaîne soit valide, pouvez-vous m'aider s'il vous plaît.
Devesh

212

Cela peut être utile pour ceux qui souhaitent utiliser dateformater.dateformat; si tu veux que 12.09.18tu utilisesdateformater.dateformat = "dd.MM.yy"

Wednesday, Sep 12, 2018           --> EEEE, MMM d, yyyy
09/12/2018                        --> MM/dd/yyyy
09-12-2018 14:11                  --> MM-dd-yyyy HH:mm
Sep 12, 2:11 PM                   --> MMM d, h:mm a
September 2018                    --> MMMM yyyy
Sep 12, 2018                      --> MMM d, yyyy
Wed, 12 Sep 2018 14:11:54 +0000   --> E, d MMM yyyy HH:mm:ss Z
2018-09-12T14:11:54+0000          --> yyyy-MM-dd'T'HH:mm:ssZ
12.09.18                          --> dd.MM.yy
10:41:02.112                      --> HH:mm:ss.SSS

2
Votre réponse a été si éclairante et a résolu mon problème. Je vous remercie.
andrewcar

50

Swift 3 et supérieur

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: date)) // Jan 2, 2001

Ceci est également utile lorsque vous souhaitez localiser votre application. Les paramètres régionaux (identificateur :) utilisent le code ISO 639-1 . Voir aussi la documentation Apple


8
Si vous souhaitez localiser votre application, utilisez simplement Locale.currentpour utiliser les paramètres régionaux de l'utilisateur.
Victor Engel

46

Swift - 5,0

let date = Date()
let formate = date.getFormattedDate(format: "yyyy-MM-dd HH:mm:ss") // Set output formate

extension Date {
   func getFormattedDate(format: String) -> String {
        let dateformat = DateFormatter()
        dateformat.dateFormat = format
        return dateformat.string(from: self)
    }
}

Swift - 4.0

2018-02-01T19: 10: 04 + 00: 00 Convert février 01,2018

extension Date {
    static func getFormattedDate(string: String , formatter:String) -> String{
        let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

        let dateFormatterPrint = DateFormatter()
        dateFormatterPrint.dateFormat = "MMM dd,yyyy"

        let date: Date? = dateFormatterGet.date(from: "2018-02-01T19:10:04+00:00")
        print("Date",dateFormatterPrint.string(from: date!)) // Feb 01,2018
        return dateFormatterPrint.string(from: date!);
    }
}

36

Version Swift 3 avec le nouvel Dateobjet à la place NSDate:

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

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd,yyyy"

let date: Date? = dateFormatterGet.date(from: "2017-02-14 17:24:26")
print(dateFormatter.string(from: date!))

EDIT: après suggestion mitul-nakum


2
dateFormatterGet.dateFormat = "aaaa-MM-jj HH: mm: ss" Le format d'heure nécessitera une majuscule HH, car l'heure est au
format

22

rapide 3

let date : Date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"
let todaysDate = dateFormatter.string(from: date)

16

J'ai résolu mon problème au format yyyy-MM-dd'T'HH:mm:ss.SSS'Z'(par exemple 2018-06-15T00: 00: 00.000Z) avec ceci:

func formatDate(date: String) -> String {
   let dateFormatterGet = DateFormatter()
   dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

   let dateFormatter = DateFormatter()
   dateFormatter.dateStyle = .medium
   dateFormatter.timeStyle = .none
   //    dateFormatter.locale = Locale(identifier: "en_US") //uncomment if you don't want to get the system default format.

   let dateObj: Date? = dateFormatterGet.date(from: date)

   return dateFormatter.string(from: dateObj!)
}

9

Swift 3 avec une Dateextension

extension Date {
    func string(with format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.string(from: self)
    }
}

Ensuite, vous pouvez l'utiliser comme ceci:

let date = Date()
date.string(with: "MMM dd, yyyy")

8

Swift 4, 4.2 et 5

func getFormattedDate(date: Date, format: String) -> String {
        let dateformat = DateFormatter()
        dateformat.dateFormat = format
        return dateformat.string(from: date)
}

let formatingDate = getFormattedDate(date: Date(), format: "dd-MMM-yyyy")
        print(formatingDate)

1
C'est une bonne solution courte avec un seul DateFormatter()! Attention: le DateFormatterprend également en compte la région d'application (définie dans le schéma)! Par exemple 2019-05-27 11:03:03 +0000avec le format yyyy-MM-dd HH:mm:sset "Allemagne" comme la région se transforme en 2019-05-27 13:03:03. Cette différence est causée par l'heure d'été: en été, l'Allemagne est GMT + 2, tandis qu'en hiver, c'est GMT + 1.
Néph

4

Si vous souhaitez analyser la date de "1996-12-19T16: 39: 57-08: 00", utilisez le format suivant "aaaa-MM-jj'T'HH: mm: ssZZZZZ":

let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

/* 39 minutes and 57 seconds after the 16th hour of December 19th, 1996 with an offset of -08:00 from UTC (Pacific Standard Time) */
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.date(from: string)

sur Apple https://developer.apple.com/documentation/foundation/dateformatter


3

Une autre possibilité intéressante de format date. Cette capture d'écran appartient à l'application "News" d'Apple.

Capture d'écran de l'application

Voici le code:

let dateFormat1 = DateFormatter()
dateFormat1.dateFormat = "EEEE"
let stringDay = dateFormat1.string(from: Date())

let dateFormat2 = DateFormatter()
dateFormat2.dateFormat = "MMMM"
let stringMonth = dateFormat2.string(from: Date())

let dateFormat3 = DateFormatter()
dateFormat3.dateFormat = "dd"
let numDay = dateFormat3.string(from: Date())

let stringDate = String(format: "%@\n%@ %@", stringDay.uppercased(), stringMonth.uppercased(), numDay)

Rien à ajouter à l'alternative proposée par lorenzoliveto. C'est juste parfait.

let dateFormat = DateFormatter()
dateFormat.dateFormat = "EEEE\nMMMM dd"
let stringDate = dateFormat.string(from: Date()).uppercased()

Cela peut être compacté en utilisant un seul formateur de date au format "EEEE \ nMMMM jj".
LorenzOliveto

Je vous remercie. Je ne connaissais pas cette syntaxe. Très utile! Merci beaucoup!
Markus

RECTIFICATION: J'ai testé le code mais vous n'obtenez pas les lettres en majuscules.
Markus

1
Oui, les majuscules doivent être appliquées à la chaîne renvoyée, comme dans votre réponse. Le formateur de date ne renvoie pas de chaîne majuscule. Ajoutez simplement .uppercased () comme ceci "dateFormat.string (from: Date ()). Uppercased ()"
LorenzOliveto

3
    import UIKit
    // Example iso date time
    let isoDateArray = [
        "2020-03-18T07:32:39.88Z",
        "2020-03-18T07:32:39Z",
        "2020-03-18T07:32:39.8Z",
        "2020-03-18T07:32:39.88Z",
        "2020-03-18T07:32:39.8834Z"
    ]


    let dateFormatterGetWithMs = DateFormatter()
    let dateFormatterGetNoMs = DateFormatter()

// Formater with and without millisecond 
    dateFormatterGetWithMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateFormatterGetNoMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"

    let dateFormatterPrint = DateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd,yyyy"

    for dateString in isoDateArray {
        var date: Date? = dateFormatterGetWithMs.date(from: dateString)
        if (date == nil){
            date = dateFormatterGetNoMs.date(from: dateString)
        }
        print("===========>",date!)
    }

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Piotr Labunski

2

Pour convertir 2016-02-29 12:24:26 en une date, utilisez ce formateur de date:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"

Edit: Pour obtenir la sortie le 29 février 2016, utilisez ce formateur de date:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"

Mais comment allez-vous convertir cela en ce type de format de date 29 février 2016
Sydney Loteria

savez-vous pourquoi je suis nul lorsque j'essaye d'imprimer ceci?
Pavlos

2

utilisez simplement la fonction ci-dessous pour convertir le format de date: -

  let convertedFormat =  convertToString(dateString: "2019-02-12 11:23:12", formatIn: "yyyy-MM-dd hh:mm:ss", formatOut: "MMM dd, yyyy")    //calling function

   print(convertedFormat) // feb 12 2019


 func convertToString (dateString: String, formatIn : String, formatOut : String) -> String {

    let dateFormater = DateFormatter()
    dateFormater.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!
    dateFormater.dateFormat = formatIn
    let date = dateFormater.date(from: dateString)

    dateFormater.timeZone = NSTimeZone.system

    dateFormater.dateFormat = formatOut
    let timeStr = dateFormater.string(from: date!)
    return timeStr
 }

1

Pour Swift 4.2, 5

Transmettez la date et le format comme vous le souhaitez. Pour choisir le format que vous pouvez visiter, le site Web de NSDATEFORMATTER :

static func dateFormatter(date: Date,dateFormat:String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat
    return dateFormatter.string(from: date)
}

0

rapide 3

func dataFormat(dataJ: Double) -> String {

        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .long
        dateFormatter.timeStyle = .none
        let date = Date(timeIntervalSince1970: dataJ)
        return (dataJ != nil) ? "Today, \(dateFormatter.string(from: date))" : "Date Invalid"

    }

0

Placez-le en extension et appelez-le comme ci-dessous. Il est facile à utiliser dans toute l'application.

self.getFormattedDate(strDate: "20-March-2019", currentFomat: "dd-MMM-yyyy", expectedFromat: "yyyy-MM-dd")

la mise en oeuvre

func getFormattedDate(strDate: String , currentFomat:String, expectedFromat: String) -> String{
        let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = currentFomat

        let date : Date = dateFormatterGet.date(from: strDate)!

        dateFormatterGet.dateFormat = expectedFromat
        return dateFormatterGet.string(from: date)
    }

0

Je recommande d'ajouter le fuseau horaire par défaut. Je vais montrer un exemple pour swift 5
1. nouveau fichier d'extensionDate+Formatter.swift

import Foundation

extension Date {
    func getFormattedDateString(format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        dateFormatter.timeZone = TimeZone.current
        return dateFormatter.string(from: self)
    }
}
  1. Exemple d'utilisation
    let date = Date()
    let dateString = date.getFormattedDateString(format: "yyyy-MM-dd HH:mm:ss")
    print("dateString > \(dateString)")
    // print
    // dateString > 2020-04-30 15:15:21
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.