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.


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

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.


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
}

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


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

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

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.


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

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)

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)

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


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)

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

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

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

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)

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
}

-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
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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.