Comment convertir la date de chaîne en NSDate?

195

Je veux convertir "2014-07-15 06: 55: 14.198000 + 00: 00" cette date de chaîne en NSDate dans Swift.

Shardul
la source
Il semble que votre chaîne "2014-07-15 06: 55: 14.198000 + 00: 00" ne soit pas accessible si vous utilisez NSDateFormatter
Alex Peda
En tant que ressource complémentaire à toutes les réponses ci-dessous, je recommande fortement de consulter nsdateformatter.com
user3344977
Les anciennes réponses ici sont vraiment fausses . Le doco d'Apple dit clairement que vous devez mettre en cache le formateur. stackoverflow.com/a/42370648/294884
Fattie
Si vous avez besoin d'aide avec le format, nsdateformatter.com
Pedro Luz

Réponses:

341

essaye ça:

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

Pour plus d'informations, consultez les classes NSDateFormatter et DateFormatter du framework Foundation pour Objective-C et Swift, respectivement.

Swift 3 et versions ultérieures (Swift 4 inclus)

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
x4h1d
la source
11
Trouvé la solution juste besoin de définir "aaaa-MM-jj hh: mm: ss.SSSSxxx" ce format de date
Shardul
1
J'ai une chaîne de date comme celle-ci "2014-07-15 06: 55: 14-0400" et j'ai essayé d'utiliser yyyy-MM-dd hh:mm:ssZZZ. Mais je ne parviens pas à extraire l'objet date de la chaîne.
iamprem
2
@Prem, si vous voyez que la sortie est "2014-07-15 10:55:14 +0000"correcte. À partir de la NSDatedescription, la sortie de la date serait calculée avec différence (ici, GMT -4 heures). Si vous voulez obtenir la différence entre GMT et UTC, -0400vérifiez cette référence
x4h1d
@ x4h1d, hé je l'ai! J'ai fait une erreur hhqui devrait être HH. Merci!
iamprem
3
@ lmiguelvargasf, je pense que ce serait yyyy-MM-dd'T'HH:mm:ss.SSS'Z'. Je suppose que Zc'est juste un personnage ici. N'oubliez pas, Za également une signification particulière. Si vous souhaitez Zspécifier basic hmsque le format serait 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)

Je peux le faire avec ce code.

Kiattisak Anoochitarom
la source
5
Le code n'est pas correct. Il affiche certains "15 janvier 2014, 00h00"
Jake Lin
5
utiliser à la ddplace de DDdevrait aider à résoudre le problème "toujours janvier".
Pascal Belloncle
1
La version correcte est, yyyy-MM-ddsinon, la date analysée est bloquée en janvier - j'ai mis à jour la réponse pour refléter le changement.
Zorayr
Et si je veux passer la date actuelle sous forme de chaîne. Est-ce que ça va marcher?
Arjun Kalidas
@Zorayr, Kittisak: Je reçois le message, facultatif (2014-07-14 18:30:00 +0000) cela signifie qu'un jour est décrémenté. Comment puis-je réparer cela ?
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
}

Mis à jour pour 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
}
idris yıldız
la source
17

Détails

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

Solution

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

Usage

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

Résultat

entrez la description de l'image ici

Plus d'information

À propos du format de date

Vasily Bodnarchuk
la source
15

Si vous devez souvent analyser la chaîne dans une date, vous souhaiterez peut-être déplacer la fonctionnalité dans une extension. J'ai créé un fichier sharedCode.swift et y ai placé mes extensions:

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

Ensuite, si vous souhaitez convertir votre chaîne en NSDate, vous pouvez simplement écrire quelque chose comme:

var myDate = myDateString.toDateTime()
user2266987
la source
1
Merci. Il est également possible, bien que moins utile, d'écrire: var myDate = "04-05-2015" .toDateTime () J'ai trouvé cela pratique lors de la configuration des données de test.
Stephen Watson
1
Je suis sûr que cela hhdevrait être le HHcas dans ce cas.
Alex
Cela ne me donne pas dans le format que je spécifie: var date = NSDate (); laissez dateFormatter = NSDateFormatter (); dateFormatter.dateFormat = "MMMM j, AAAA"; laissez myDate = dateFormatter.stringFromDate (date); Et en plus de cela si j'utilise votre extension comme ça -> var myDate2 = myDate.toDateTime (); Cela me donne une date complètement différente et non la date actuelle.
Arjun Kalidas
9

Pour 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)
}
Rishabh Dugar
la source
5

Les fragments de code sur cette page QA sont "à l'envers" ...

La première chose qu'Apple mentionne, c'est que vous mettez en cache votre formateur ...

Lien vers le doco Apple indiquant exactement comment procéder:

Formater le cache pour plus d'efficacité La création d'un formateur de date n'est pas une opération bon marché. ... cache une seule instance ...

Utilisez un global ...

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

Ensuite, utilisez simplement ce formateur n'importe où ...

let s = df.string(from: someDate)

ou

let d = df.date(from: someString)

Ou utilisez l'une des nombreuses autres méthodes pratiques de DateFormatter.

C'est aussi simple que cela.

(Si vous écrivez une extension sur String, votre code est complètement "à l'envers" - vous ne pouvez pas utiliser d'appels dateFormatter!)

Notez que vous aurez généralement quelques-uns de ces globaux .. tels que "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" .. etc.

Fattie
la source
Pas besoin de les laisser à l'échelle mondiale. Vous pouvez étendre Formatter simplement déclarer vos propriétés statiques. consultez ce stackoverflow.com/a/43658213/2303865
Leo Dabus
4

Extensions de soutien rapide, avec l' extension , vous pouvez ajouter une nouvelle fonctionnalité à un existant class, structure, enumerationou le protocoltype.

Vous pouvez ajouter une nouvelle initfonction à l' NSDateobjet en étendant l'objet à l'aide du extensionmot - clé.

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

Vous pouvez maintenant lancer un objet NSDate en utilisant:

let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")
Hugo Pereira
la source
J'aime la manière init. N'y a-t-il pas une autre façon de créer la date sans utiliser timeInterval? que se passe-t-il si nsdate cesse d'avoir un initialiseur avec un paramètre de date? comment le résoudriez-vous? Personnellement, je préfère une méthode d'initiation mais je ne sais pas comment surmonter ce problème
Mijail
J'ai un problème: ma date sous forme de chaîne est la suivante: "2017-03-10 22:16:00 +0000" et j'ai utilisé ce format: "aaaa-MM-jj hh: mm: ss Z" et celui-ci: "aaaa-MM-jj'T'HH: mm: ss". Mais pour les deux, quand je fais cela: laissez beginDate = df.date(from: beginDateString), je reçois un zéro! Pourquoi? ( df = DateFormatter())
Paul Bénéteau
4

Depuis Swift 3, de nombreux préfixes NS ont été supprimés.

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)
toddg
la source
J'ai un problème: ma date sous forme de chaîne est la suivante: "2017-03-10 22:16:00 +0000" et j'ai utilisé ce format: "aaaa-MM-jj hh: mm: ss Z" et celui-ci: "aaaa-MM-jj'T'HH: mm: ss". Mais pour les deux, quand je fais cela: laissez beginDate = df.date(from: beginDateString), je reçois un zéro! Pourquoi? ( df = DateFormatter())
Paul Bénéteau
4

Swift 3,4:

2 conversions utiles:

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

Utilisation: 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)
Naishta
la source
3

POUR 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

    }
}

REMARQUE: CECI RETOURNERA LA CHAÎNE ORIGINALE EN CAS D'ERREUR

Brian
la source
2

Pour ajouter une chaîne dans le format de date dans Swift, je l'ai fait

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

cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)
ioopl
la source
2

Ce travail pour moi ..

    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!)
    }
marlonpya
la source
1

Vous trouverez ci-dessous quelques options de conversion de format de chaîne en date pouvant être utilisées dans iOS rapide.

  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
Devesh
la source
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
}
Vinod Joshi
la source
0

Vous pouvez essayer ce code rapide

    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)
Rahul Panzade
la source
0

SWIFT 5 , Xcode 11.0

Passez votre (date dans la chaîne) au format "dateString" et au format "dateFormat" que vous souhaitez. Pour choisir le format, utilisez le site 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
}
Abdul Karim Khan
la source
-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

Ch0c0late
la source
2
Comment est-ce censé fonctionner? Le formateur de date n'est pas initialisé et il n'y a également aucune raison de diviser la déclaration et l'initialisation de la date.
Ixx