Wie kann ich das String-Datum in NSDate konvertieren?


195

Ich möchte "2014-07-15 06: 55: 14.198000 + 00: 00" dieses Zeichenfolgendatum in NSDate in Swift konvertieren.


Sieht aus wie Ihre Zeichenfolge "2014-07-15 06: 55: 14.198000 + 00: 00" nicht erreichbar ist, wenn Sie NSDateFormatter
Alex Peda



Die alten Antworten hier sind wirklich falsch . Das Apple-Dokument sagt kristallklar, dass Sie den Formatierer zwischenspeichern müssen. stackoverflow.com/a/42370648/294884
Fattie

Wenn Sie einen Helfer mit dem Format benötigen, nsdateformatter.com
Pedro Luz

Antworten:


341

Versuche dies:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = /* find out and place date format from 
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
let date = dateFormatter.dateFromString(/* your_date_string */)

Überprüfen Sie für weitere Abfragen die NSDateFormatter- und DateFormatter- Klassen des Foundation- Frameworks für Objective-C bzw. Swift.

Swift 3 und höher (Swift 4 enthalten)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = /* date_format_you_want_in_string from
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
guard let date = dateFormatter.date(from: /* your_date_string */) else {
   fatalError("ERROR: Date conversion failed due to mismatched format.")
}

// use date constant here

11
Gefunden, die Lösung muss nur "JJJJ-MM-TT hh: mm: ss.SSSSxxx" dieses Datumsformat setzen
Shardul

1
Ich habe eine Datumszeichenfolge wie diese "2014-07-15 06: 55: 14-0400" und ich habe versucht, sie zu verwenden yyyy-MM-dd hh:mm:ssZZZ. Aber ich kann das Datumsobjekt nicht aus der Zeichenfolge herausholen.
iamprem

2
@Prem, wenn Sie sehen, dass die Ausgabe "2014-07-15 10:55:14 +0000"korrekt ist. Wie aus der NSDateBeschreibung hervorgeht, würde die Ausgabe des Datums mit Differenz berechnet (hier GMT -4 Stunden). Wenn Sie den Unterschied zwischen GMT und UTC erhalten möchten, -0400überprüfen Sie diese Referenz
x4h1d

@ x4h1d, Hey ich habe es! Ich habe einen Fehler gemacht, bei hhdem es sein sollte HH. Vielen Dank!
iamprem

3
@ lmiguelvargasf, ich denke das wäre yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Ich nahm an, dass Zes hier nur ein Charakter ist. Denken Sie daran, Zhat auch eine besondere Bedeutung. Wenn Sie Zangeben möchten , wie basic hmsdas Format wäre yyyy-MM-dd'T'HH:mm:ss.SSSZ.
x4h1d

71

Swift 4

import Foundation

let dateString = "2014-07-15" // change to your date format

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

let date = dateFormatter.date(from: dateString)
println(date)

Swift 3

import Foundation

var dateString = "2014-07-15" // change to your date format

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

var date = dateFormatter.dateFromString(dateString)
println(date)

Ich kann es mit diesem Code machen.


5
Der Code ist nicht richtig. Es gibt einige "15. Januar 2014, 00:00 Uhr"
Jake Lin

5
Die Verwendung von ddanstelle von DDsollte helfen, das Problem "immer Januar" zu beheben.
Pascal Belloncle

1
Die richtige Version ist, yyyy-MM-ddandernfalls bleibt das analysierte Datum im Januar hängen - ich habe die Antwort aktualisiert, um die Änderung widerzuspiegeln.
Zorayr

Was ist, wenn ich das aktuelle Datum als Zeichenfolge übergeben möchte? Ob das funktioniert?
Arjun Kalidas

@Zorayr, Kittisak: Ich bekomme die Ausgabe, Optional (2014-07-14 18:30:00 +0000), das heißt, ein Tag wird dekrementiert. Wie kann ich das beheben?
Vineesh TP

54
 func convertDateFormatter(date: String) -> String
 {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let date = dateFormatter.dateFromString(date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let timeStamp = dateFormatter.stringFromDate(date!)


    return timeStamp
}

Aktualisiert für Swift 3.

func convertDateFormatter(date: String) -> String
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let date = dateFormatter.date(from: date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: date!)


    return timeStamp
}

17

Einzelheiten

  • Swift 4, Xcode 9.2
  • Swift 5, Xcode 10.2 (10E125)

Lösung

import Foundation

extension DateFormatter {

    convenience init (format: String) {
        self.init()
        dateFormat = format
        locale = Locale.current
    }
}

extension String {

    func toDate (dateFormatter: DateFormatter) -> Date? {
        return dateFormatter.date(from: self)
    }

    func toDateString (dateFormatter: DateFormatter, outputFormat: String) -> String? {
        guard let date = toDate(dateFormatter: dateFormatter) else { return nil }
        return DateFormatter(format: outputFormat).string(from: date)
    }
}

extension Date {

    func toString (dateFormatter: DateFormatter) -> String? {
        return dateFormatter.string(from: self)
    }
}

Verwendung

var dateString = "14.01.2017T14:54:00"
let dateFormatter = DateFormatter(format: "dd.MM.yyyy'T'HH:mm:ss")
let date = Date()

print("original String with date:               \(dateString)")
print("date String() to Date():                 \(dateString.toDate(dateFormatter: dateFormatter)!)")
print("date String() to formated date String(): \(dateString.toDateString(dateFormatter: dateFormatter, outputFormat: "dd MMMM")!)")
let dateFormatter2 = DateFormatter(format: "dd MMM HH:mm")
print("format Date():                           \(date.toString(dateFormatter: dateFormatter2)!)")

Ergebnis

Geben Sie hier die Bildbeschreibung ein

Mehr Informationen

Informationen zum Datumsformat


15

Wenn Sie die Zeichenfolge häufig in ein Datum analysieren müssen, möchten Sie die Funktionalität möglicherweise in eine Erweiterung verschieben. Ich habe eine sharedCode.swift-Datei erstellt und meine Erweiterungen dort abgelegt:

extension String
{   
    func toDateTime() -> NSDate
    {
        //Create Date Formatter
        let dateFormatter = NSDateFormatter()

        //Specify Format of String to Parse
        dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss.SSSSxxx"

        //Parse into NSDate
        let dateFromString : NSDate = dateFormatter.dateFromString(self)!

        //Return Parsed Date
        return dateFromString
    }
}

Wenn Sie dann Ihren String in ein NSDate konvertieren möchten, können Sie einfach Folgendes schreiben:

var myDate = myDateString.toDateTime()

1
Vielen Dank. Es ist auch möglich, obwohl weniger nützlich, Folgendes zu schreiben: var myDate = "04-05-2015" .toDateTime () Ich fand dies praktisch, wenn ich Testdaten einrichtete.
Stephen Watson

1
Ich bin mir ziemlich sicher , dass das hhsollte HHin diesem Fall.
Alex

Dies gibt mir nicht das von mir angegebene Format: var date = NSDate (); let dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, JJJJ"; let myDate = dateFormatter.stringFromDate (Datum); Und obendrein, wenn ich Ihre Erweiterung wie folgt verwende -> var myDate2 = myDate.toDateTime (); Es gibt mir ein ganz anderes Datum und nicht das aktuelle Datum.
Arjun Kalidas

9

Für Swift 3

func stringToDate(_ str: String)->Date{
    let formatter = DateFormatter()
    formatter.dateFormat="yyyy-MM-dd hh:mm:ss Z"
    return formatter.date(from: str)!
}
func dateToString(_ str: Date)->String{
    var dateFormatter = DateFormatter()
    dateFormatter.timeStyle=DateFormatter.Style.short
    return dateFormatter.string(from: str)
}

5

Die Codefragmente auf dieser QS-Seite sind "verkehrt herum" ...

Das erste, was Apple erwähnt, ist, dass Sie Ihren Formatierer zwischenspeichern ...

Link zu Apple Doco, in dem genau angegeben ist, wie das geht:

Cache-Formatierer für mehr Effizienz Das Erstellen eines Datumsformatierers ist kein billiger Vorgang. ... eine einzelne Instanz zwischenspeichern ...

Verwenden Sie eine globale ...

let df : DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter 
}()

Dann verwenden Sie diesen Formatierer einfach überall ...

let s = df.string(from: someDate)

oder

let d = df.date(from: someString)

Oder verwenden Sie eine der vielen anderen praktischen Methoden für DateFormatter.

So einfach ist das.

(Wenn Sie eine Erweiterung für String schreiben, ist Ihr Code vollständig "verkehrt herum" - Sie können keine dateFormatter-Aufrufe verwenden!)

Beachten Sie, dass Sie normalerweise einige dieser globalen Elemente haben, z. B. "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" usw.


Sie müssen nicht im globalen Bereich belassen werden. Sie können Formatter erweitern, indem Sie Ihre Eigenschaften als statisch deklarieren. Überprüfen Sie diese stackoverflow.com/a/43658213/2303865
Leo Dabus

4

Swift Verlängerungen, mit der Erweiterung können Sie eine neue Funktionalität zu einem bestehenden hinzufügen class, structure, enumeration, oder protocolTyp.

Sie können dem Objekt eine neue initFunktion hinzufügen , NSDateindem Sie das Objekt mit dem extensionSchlüsselwort erweitern.

extension NSDate
{
    convenience
    init(dateString:String) {
        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyyMMdd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "fr_CH_POSIX")
        let d = dateStringFormatter.dateFromString(dateString)!
        self.init(timeInterval:0, sinceDate:d)
    }
} 

Jetzt können Sie ein NSDate-Objekt mit folgenden Elementen initiieren:

let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")

Ich mag den Init-Weg. Gibt es nicht eine andere Möglichkeit, das Datum ohne timeInterval zu erstellen? Was ist, wenn nsdate keinen Initialisierer mit einem Datumsparameter mehr hat? Wie würden Sie es lösen? Persönlich bevorzuge ich einen Init-Weg, aber ich weiß nicht, wie ich dieses Problem überwinden soll
Mijail

Ich habe ein Problem: Mein Datum als Zeichenfolge lautet wie folgt: "2017-03-10 22:16:00 +0000" und ich habe dieses Format verwendet: "JJJJ-MM-TT HH: MM: SS Z" und dieses: "JJJJ-MM-TT'T'HH: MM: SS". Aber für beide, wenn ich das mache: let beginDate = df.date(from: beginDateString), ich bekomme eine Null! Warum? ( df = DateFormatter())
Paul Bénéteau

4

Seit Swift 3 wurden viele der NS-Präfixe gelöscht.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
/* date format string rules
 * http://userguide.icu-project.org/formatparse/datetime
 */

let date = dateFormatter.date(from: dateString)

Ich habe ein Problem: Mein Datum als Zeichenfolge lautet wie folgt: "2017-03-10 22:16:00 +0000" und ich habe dieses Format verwendet: "JJJJ-MM-TT HH: MM: SS Z" und dieses: "JJJJ-MM-TT'T'HH: MM: SS". Aber für beide, wenn ich das mache: let beginDate = df.date(from: beginDateString), ich bekomme eine Null! Warum? ( df = DateFormatter())
Paul Bénéteau

4

Swift 3,4:

2 nützliche Konvertierungen:

string(from: Date) // to convert from Date to a String
date(from: String) // to convert from String to Date

Verwendungszweck 1.

let date = Date() //gives today's date
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"
let todaysDateInUKFormat = dateFormatter.string(from: date)

2.

 let someDateInString = "23.06.2017"
 var getDateFromString = dateFormatter.date(from: someDateInString)

3

FÜR SWIFT 3.1

func convertDateStringToDate(longDate: String) -> String{

    /* INPUT: longDate = "2017-01-27T05:00:00.000Z"
     * OUTPUT: "1/26/17"
     * date_format_you_want_in_string from
     * http://userguide.icu-project.org/formatparse/datetime
     */

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

    if date != nil {

        let formatter = DateFormatter()
        formatter.dateStyle = .short
        let dateShort = formatter.string(from: date!)

        return dateShort

    } else {

        return longDate

    }
}

HINWEIS: Dadurch wird die ursprüngliche Zeichenfolge bei einem Fehler zurückgegeben


2

Um eine Zeichenfolge im Datumsformat in Swift hinzuzufügen, habe ich dies getan

 var dataFormatter:NSDateFormatter = NSDateFormatter()
                dataFormatter.dateFormat = "dd-MMMM 'at' HH:mm a"

cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)

2

Diese Arbeit für mich ..

    import Foundation
    import UIKit

    //dateString = "01/07/2017"
    private func parseDate(_ dateStr: String) -> String {
            let simpleDateFormat = DateFormatter()
            simpleDateFormat.dateFormat = "dd/MM/yyyy" //format our date String
            let dateFormat = DateFormatter()
            dateFormat.dateFormat = "dd 'de' MMMM 'de' yyyy" //format return

            let date = simpleDateFormat.date(from: dateStr)
            return dateFormat.string(from: date!)
    }

1

Im Folgenden finden Sie einige Konvertierungsoptionen für Zeichenfolgen in Datumsformate, die in schnellem iOS verwendet werden können.

  1. Thursday, Dec 27, 2018 format = EEEE, MMM d, yyyy
  2. 12/27/2018 format = MM/dd/yyyy
  3. 12-27-2018 09:59 format = MM-dd-yyyy HH:mm
  4. Dec 27, 9:59 AM format = MMM d, h:mm a
  5. December 2018 format = MMMM yyyy
  6. Dec 27, 2018 format = MMM d, yyyy
  7. Thu, 27 Dec 2018 09:59:19 +0000 format = E, d MMM yyyy HH:mm:ss Z
  8. 2018-12-27T09:59:19+0000 format = yyyy-MM-dd'T'HH:mm:ssZ
  9. 27.12.18 format = dd.MM.yy
  10. 09:59:19.815 format = HH:mm:ss.SSS

0
Swift: iOS
if we have string, convert it to NSDate,

var dataString = profileValue["dob"] as String
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"

// convert string into date
let dateValue:NSDate? = dateFormatter.dateFromString(dataString)

if you have and date picker parse date like this

// to avoid any nil value
if let isDate = dateValue {
self.datePicker.date = isDate
}

0

Sie können diesen schnellen Code ausprobieren

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"//same as strDate date formator
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00")//Must used if you get one day less in conversion
    let convertedDateObject = dateFormatter.date(from: strDate)

0

SWIFT 5 , Xcode 11.0

Übergeben Sie Ihr (Datum in Zeichenfolge) im gewünschten Datumsformat "dateString" und "dateFormat". Verwenden Sie zur Auswahl des Formats die NDateFormatter-Website .

func getDateFrom(dateString: String, dateFormat: String) -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat
    dateFormatter.locale = Locale(identifier: "en_US")
    guard let date = dateFormatter.date(from: dateString) else {return nil}
    return date
}

-3
import Foundation

let now : String = "2014-07-16 03:03:34 PDT"
var date : NSDate
var dateFormatter : NSDateFormatter

date = dateFormatter.dateFromString(now)

date // $R6: __NSDate = 2014-07-16 03:03:34 PDT

https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/doc/uid/20000447-SW32


2
Wie soll das funktionieren? Der Datumsformatierer ist nicht initialisiert und es gibt auch keinen Grund, die Deklaration und Initialisierung des Datums aufzuteilen.
Ixx
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.