Come posso convertire la data della stringa in NSDate?


195

Voglio convertire "15/07/2014 06: 55: 14.198000 + 00: 00" questa data stringa in NSDate in Swift.


Sembra che la tua stringa "2014-07-15 06: 55: 14.198000 + 00: 00" non è raggiungibile se usi NSDateFormatter
Alex Peda,


Come risorsa complementare a tutte le risposte di seguito, consiglio vivamente di dare un'occhiata a nsdateformatter.com
user3344977

Le vecchie risposte qui sono davvero ERRATE . Il doco di Apple dice che è assolutamente necessario memorizzare nella cache il formatter. stackoverflow.com/a/42370648/294884
Fattie

Se hai bisogno di un aiuto con il formato, nsdateformatter.com
Pedro Luz,

Risposte:


341

prova questo:

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

Per ulteriori query, controllare le classi NSDateFormatter e DateFormatter del framework Foundation per Objective-C e Swift, rispettivamente.

Swift 3 e versioni successive (Swift 4 incluso)

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
Trovato la soluzione è sufficiente impostare "aaaa-MM-gg hh: mm: ss.SSSSxxx" questo formato data
Shardul

1
Ho una stringa di date come questa "2014-07-15 06: 55: 14-0400" e ho provato a utilizzare yyyy-MM-dd hh:mm:ssZZZ. Ma non sono in grado di estrarre l'oggetto data dalla stringa.
iamprem,

2
@Prem, se vedi che l'output è "2014-07-15 10:55:14 +0000"corretto. A partire dalla NSDatedescrizione, l'output della data verrà calcolato con la differenza (qui, GMT -4 ore). Se vuoi ottenere la differenza tra GMT e UTC, che è -0400controllare questo riferimento
x4h1d

@ x4h1d, Hey, ce l'ho! Ho fatto un errore in hhcui dovrebbe essere HH. Grazie!
iamprem,

3
@ lmiguelvargasf, penso che sarebbe yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Ho pensato che Zfosse solo un personaggio qui. Ricorda, Zha anche un significato speciale. Se si desidera Zspecificare come basic hmssarebbe il formato 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)

Posso farlo con questo codice.


5
Il codice non è giusto Emette alcuni "15 gennaio 2014, 12:00 AM"
Jake Lin,

5
l'utilizzo ddanziché DDdovrebbe aiutare a risolvere il problema "sempre gennaio".
Pascal Belloncle,

1
La versione corretta è, yyyy-MM-ddaltrimenti, la data analizzata è bloccata a gennaio - ho aggiornato la risposta per riflettere la modifica.
Zorayr,

Cosa succede se voglio passare la data corrente come stringa. Funzionerà?
Arjun Kalidas,

@Zorayr, Kittisak: sto ottenendo il risultato, Opzionale (2014-07-14 18:30:00 +0000) significa che un giorno è diminuito. Come posso risolvere questo problema?
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
}

Aggiornato per 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

Dettagli

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

Soluzione

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

uso

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)!)")

Risultato

inserisci qui la descrizione dell'immagine

Maggiori informazioni

Informazioni sul formato della data


15

Se hai bisogno di analizzare spesso la stringa in una data, potresti voler spostare la funzionalità in un'estensione. Ho creato un file sharedCode.swift e ho inserito le mie estensioni:

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

Quindi se vuoi convertire la tua stringa in un NSDate puoi semplicemente scrivere qualcosa del tipo:

var myDate = myDateString.toDateTime()

1
Grazie. È anche possibile, sebbene meno utile, scrivere: var myDate = "04-05-2015" .toDateTime () L'ho trovato utile durante l'impostazione dei dati di test.
Stephen Watson,

1
Sono abbastanza sicuro che hhdovrebbe essere HHin questo caso.
Alex,

Questo non mi dà nel formato che specifica: var date = NSDate (); let dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM d, AAAA"; let myDate = dateFormatter.stringFromDate (date); E soprattutto se uso l'estensione in questo modo -> var myDate2 = myDate.toDateTime (); Mi sta dando una data completamente diversa e non la data corrente.
Arjun Kalidas,

9

Per 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

I frammenti di codice in questa pagina di QA sono "sottosopra" ...

La prima cosa che Apple menziona è che memorizzi nella cache il tuo formatter ...

Link al doco di Apple che indica esattamente come farlo:

Formatter della cache per efficienza Creare un formatter per la data non è un'operazione economica. ... memorizza nella cache una singola istanza ...

Usa un globale ...

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

Quindi usa semplicemente quel formattatore ovunque ...

let s = df.string(from: someDate)

o

let d = df.date(from: someString)

O usa uno qualsiasi degli altri molti, molti metodi convenienti su DateFormatter.

È così semplice

(Se scrivi un'estensione su String, il tuo codice è completamente "capovolto" - non puoi usare nessuna chiamata dateFormatter!)

Nota che di solito avrai alcuni di quei globi .. come "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" ... ecc.


Non è necessario lasciarli a portata globale. Puoi estendere Formatter dichiarando le tue proprietà statiche. controllare questo stackoverflow.com/a/43658213/2303865
Leo Dabus

4

Estensione della Swift, con l'estensione è possibile aggiungere una nuova funzionalità per uno esistente class, structure, enumeration, o protocoltipo.

È possibile aggiungere una nuova initfunzione NSDateall'oggetto estinguendo l'oggetto utilizzando la extensionparola chiave.

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

Ora puoi avviare un oggetto NSDate usando:

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

Mi piace il modo init. Non esiste un altro modo per creare la data senza usare timeInterval? cosa succede se nsdate smette di avere un inizializzatore con un parametro di data? come lo risolveresti? Personalmente preferisco un modo init ma non so come superare questo problema
Mijail

Ho un problema: la mia data come stringa è così: "2017-03-10 22:16:00 +0000" e ho usato questo formato: "yyyy-MM-dd hh: mm: ss Z" e questo: "aAAA-mM-dd'T'HH: mm: ss". Ma per entrambi, quando faccio questo: let beginDate = df.date(from: beginDateString), ottengo zero! perché? ( df = DateFormatter())
Paul Bénéteau,

4

Da Swift 3, molti dei prefissi NS sono stati eliminati.

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)

Ho un problema: la mia data come stringa è così: "2017-03-10 22:16:00 +0000" e ho usato questo formato: "yyyy-MM-dd hh: mm: ss Z" e questo: "aAAA-mM-dd'T'HH: mm: ss". Ma per entrambi, quando faccio questo: let beginDate = df.date(from: beginDateString), ottengo zero! perché? ( df = DateFormatter())
Paul Bénéteau,

4

Swift 3,4:

2 conversioni utili:

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

Utilizzo: 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

PER 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

    }
}

NOTA: QUESTO RESERÀ LA STRINGA ORIGINALE SE ERRORE


2

Per aggiungere una stringa nel formato data in Swift, l'ho fatto

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

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

2

Questo lavoro per me ..

    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

Di seguito sono riportate alcune opzioni di conversione da stringa a data che possono essere utilizzate in iOS rapido.

  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

Puoi provare questo codice rapido

    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

Passa la tua (data nella stringa) in "dateString" e nel formato di passaggio "dateFormat" che desideri. Per scegliere il formato, utilizzare il sito Web NDateFormatter .

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
Come dovrebbe funzionare? Il formatter data non è inizializzato e non vi è inoltre motivo di dividere la dichiarazione e l'inizializzazione della data.
Ixx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.