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)
Sydney Loteria
la source

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")
}
LorenzOliveto
la source
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
BatyrCan
la source
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

Jonas Deichelmann
la source
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!);
    }
}
Vishal Vaghasiya
la source
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

ciccioska
la source
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)
iParesh
la source
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!)
}
Ângelo Polotto
la source
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")
Jonathan Cravotta
la source
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)
Akbar Khan
la source
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

Amit Tyagi
la source
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()
Markus
la source
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!)
    }
Rajdeo Das
la source
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"
dasdom
la source
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
 }
Pankaj Jangid
la source
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)
}
Abdul Karim Khan
la source
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"

    }
M.zar
la source
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)
    }
Sunil aruru
la source
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
Zgpeace
la source