Datumsformat in Swift


150

Wie konvertiere ich diese Datums- und Uhrzeitangabe vom Datum?

Von diesem: 29.02.2016 12:24:26
bis: 29. Februar 2016

Bisher ist dies mein Code und er gibt einen Nullwert zurück:

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)

Antworten:


267

Sie müssen 2 verschiedene deklarieren NSDateFormatters, die erste, um die Zeichenfolge in a zu konvertieren, NSDateund die zweite, um das Datum in Ihrem Format zu drucken.
Versuchen Sie diesen 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 und höher:

Von Swift 3 wurde die NSDateKlasse in Dateund NSDateFormatternach geändert 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
Was passiert, wenn dateFormatterGet dateFormat zwei verschiedene Formate akzeptieren muss - eines mit Millisekunden und eines ohne Millisekunden? dh JJJJ-MM-TT'T'HH: MM: SSZZZZZ und JJJJ-MM-TT'T'HH: MM: SS: SSSZZZZZ
KvnH

1
Ich denke, Sie müssen zwei verschiedene DateFormatters deklarieren, um das Datum zu erhalten: Wenn der erste fehlschlägt (er gibt null zurück), verwenden Sie den zweiten.
LorenzOliveto

Können Sie mir bitte helfen, was wird das Datumsformat für "Di 12. März 2019 12:00:00 GMT-0500 (CDT)"
Devesh

@Devesh es sollte so etwas wie "EEE MMM d yyyy HH: mm: ss ZZZZ" sein, siehe nsdateformatter.com Es ist eine sehr hanful Seite mit allen unterstützten Formaten
LorenzOliveto

@lorenzoliveto Ja, ich habe den ganzen Weg für dieses Format versucht. Ich habe es auch auf nsdateformatter.com versucht. Trotzdem kann ich für "Di Mar 12 2019 12:00:00 GMT-0500 (CDT)" dieses Formats nichts bekommen. Ich erhalte dieses Format in einem JSON. Ich bin mir nicht sicher, ob dies eine gültige Zeichenfolge ist. Können Sie mir bitte helfen?
Devesh

211

Dies kann nützlich sein, wenn Sie dateformater.dateformat verwenden möchten. wenn du willst, verwendest 12.09.18dudateformater.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
Ihre Antwort war so aufschlussreich und hat mein Problem behoben. Danke dir.
Andrew Car

50

Swift 3 und höher

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

Dies ist auch hilfreich, wenn Sie Ihre App lokalisieren möchten. Das Gebietsschema (Kennung :) verwendet den ISO 639-1-Code . Siehe auch die Apple-Dokumentation


8
Wenn Sie Ihre App lokalisieren möchten, verwenden Sie einfach Locale.currentdas Gebietsschema des Benutzers.
Victor Engel

45

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

Swift 3- Version mit dem neuen DateObjekt stattdessen 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: nach Mitul-Nakum- Vorschlag


2
dateFormatterGet.dateFormat = "JJJJ-MM-TT HH: MM: SS" Stundenformiat erfordert Kapital HH, da die Stunde in 24
Formaten

22

schnell 3

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

16

Ich habe mein Problem mit dem Format yyyy-MM-dd'T'HH:mm:ss.SSS'Z'(zB 2018-06-15T00: 00: 00.000Z) folgendermaßen gelöst:

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 mit einer DateErweiterung

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

Dann können Sie es so verwenden:

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

8

Swift 4, 4.2 und 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
Dies ist eine gute, kurze Lösung mit nur einer DateFormatter()! Beachten Sie Folgendes: Das DateFormatterberücksichtigt auch den Anwendungsbereich (im Schema festgelegt)! ZB 2019-05-27 11:03:03 +0000mit dem Format yyyy-MM-dd HH:mm:ssund "Deutschland" als die Region wird 2019-05-27 13:03:03. Dieser Unterschied wird durch die Sommerzeit verursacht: Im Sommer ist Deutschland GMT + 2, während es im Winter GMT + 1 ist.
Neph

4

Wenn Sie das Datum von "1996-12-19T16: 39: 57-08: 00" analysieren möchten, verwenden Sie das folgende Format "yyyy-MM-dd'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)

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


3

Eine weitere interessante Möglichkeit, das Datum zu formatieren. Dieser Screenshot gehört zu Apples App "News".

App Screenshot

Hier ist der 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)

Der von Lorenzoliveto vorgeschlagenen Alternative gibt es nichts hinzuzufügen. Es ist einfach perfekt.

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

Dies kann mit nur einem Datumsformatierer im Format "EEEE \ nMMMM dd" komprimiert werden.
LorenzOliveto

Danke dir. Ich kannte diese Syntax nicht. Sehr hilfreich! Vielen Dank!
Markus

GLEICHRICHTUNG: Ich habe den Code getestet, aber Sie erhalten die Buchstaben nicht in Großbuchstaben.
Markus

1
Ja, der Großbuchstabe muss wie in Ihrer Antwort auf die zurückgegebene Zeichenfolge angewendet werden. Der Datumsformatierer gibt keine Großbuchstaben zurück. Fügen Sie einfach .uppercased () wie folgt hinzu: "dateFormat.string (from: Date ()).
Uppercased

2

Verwenden Sie diesen Datumsformatierer, um den 29.02.2016 um 12:24:26 Uhr in ein Datum umzuwandeln:

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

Bearbeiten: Um die Ausgabe am 29. Februar 2016 zu erhalten, verwenden Sie diesen Datumsformatierer:

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

Aber wie werden Sie das in diese Art von Datumsformat konvertieren 29. Februar 2016
Sydney Loteria

Weißt du, warum ich Null bekomme, wenn ich versuche, dies zu drucken?
Pavlos

2

Verwenden Sie einfach die folgende Funktion, um das Datumsformat zu konvertieren: -

  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
 }

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

Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Piotr Labunski

1

Für Swift 4.2, 5

Übergeben Sie Datum und Format nach Ihren Wünschen. Um das Format auszuwählen, das Sie besuchen können, besuchen Sie die NSDATEFORMATTER-Website :

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

0

schnell 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

Platzieren Sie es in der Erweiterung und nennen Sie es wie unten. Es ist einfach in der gesamten Anwendung zu verwenden.

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

Implementierung

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

Ich empfehle, standardmäßig eine Zeitzone hinzuzufügen. Ich werde ein Beispiel für Swift 5 zeigen.
1. Neue ErweiterungsdateiDate+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. Anwendungsbeispiel
    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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.