Convertir la chaîne en date dans Swift

136

Comment puis-je convertir cette chaîne "2016-04-14T10:44:00+0000"en un NSDateet ne conserver que l'année, le mois, le jour, l'heure?

Le Tmilieu jette vraiment ce à quoi je suis habitué lorsque je travaille avec des dates.

asheyla
la source
Vous voulez juste une année, un mois, un jour, une heure?
Mitul Marsoniya
Duplicata possible de From String to NSDate dans Swift
Fogmeister

Réponses:

231
  • Convertir la chaîne ISO8601 en date

    let isoDate = "2016-04-14T10:44:00+0000"
    
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!
  • Obtenez les composants de date pour l'année, le mois, le jour et l'heure à partir de la date

    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day, .hour], from: date)
  • Enfin, créez un nouvel Dateobjet et dépouillez les minutes et les secondes

    let finalDate = calendar.date(from:components)

Considérez également le formateur pratique ISO8601DateFormatterintroduit dans iOS 10 / macOS 12:

let isoDate = "2016-04-14T10:44:00+0000"

let dateFormatter = ISO8601DateFormatter()
let date = dateFormatter.date(from:isoDate)!
vadian
la source
3
le Z dans "aaaa-MM-jj'T'HH: mm: ssZ" a résolu ce qui ne fonctionnait pas pour moi
asheyla
Je veux juste l'année mois et jour, mais cela ne fonctionne pas pour moi
Sneha
@Sneha Si vous ne voulez pas l'heure omettez simplement.hour
vadian
@vadian je l'ai fait mais je ne reçois pas
Sneha
1
Tout en un: ISO8601DateFormatter (). Date (from: "your string")!
Mike Irving
38

Essayez le format de date suivant.

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter. dateFromString (strDate)

J'espère que ça aide..

Swift 4.1:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ"
let date = dateFormatter.date(from: strDate)
Balaji Ramakrishnan
la source
10
Je l'ai essayé, et la date est revenue nulle après cela.
asheyla
1
Impossible de convertir la valeur de type 'Chaîne' en type 'Date' par contrainte
Oleksandr
22

Dans Swift 4.1, vous pouvez faire:

func getDate() -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.locale = Locale.current
    return dateFormatter.date(from: "2015-04-01T11:42:00") // replace Date String
}
Paul Spiesberger
la source
16

Swift 3.0 à 4.2

import Foundation

extension String {

    func toDate(withFormat format: String = "yyyy-MM-dd HH:mm:ss")-> Date?{

        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.calendar = Calendar(identifier: .gregorian)
        dateFormatter.dateFormat = format
        let date = dateFormatter.date(from: self)

        return date

    }
}

extension Date {

    func toString(withFormat format: String = "EEEE ، d MMMM yyyy") -> String {

        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.calendar = Calendar(identifier: .persian)
        dateFormatter.dateFormat = format
        let str = dateFormatter.string(from: self)

        return str
    }
}
Mohammad Razipour
la source
9

Salut, vous avez un format T séparé, puis convertissez comme vous le souhaitez

// create dateFormatter with UTC time format
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date = dateFormatter.dateFromString("2015-04-01T11:42:00")

// change to a readable time format and change to local time zone
dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a"
dateFormatter.timeZone = NSTimeZone.localTimeZone() 
let timeStamp = dateFormatter.stringFromDate(date!)
Arun
la source
6

Juste votre passage dateformateet votre date alors vous obtenez Year,month,day,hour. Informaitons supplémentaires

func GetOnlyDateMonthYearFromFullDate(currentDateFormate:NSString , conVertFormate:NSString , convertDate:NSString ) -> NSString
    {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = currentDateFormate as String
        let formatter = NSDateFormatter()
        formatter.dateFormat = Key_DATE_FORMATE as String
        let finalDate = formatter.dateFromString(convertDate as String)
        formatter.dateFormat = conVertFormate as String
        let dateString = formatter.stringFromDate(finalDate!)

        return dateString
    }


Obtenir l'année

let Year = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "YYYY", convertDate: "2016-04-14T10:44:00+0000") as String


Obtenir le mois

let month = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "MM", convertDate: "2016-04-14T10:44:00+0000") as String


Get Day

let day = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "dd", convertDate: "2016-04-14T10:44:00+0000") as String


Obtenir l'heure

let hour  = self.GetOnlyDateMonthYearFromFullDate("yyyy-MM-dd'T'HH:mm:ssZ", conVertFormate: "hh", convertDate: "2016-04-14T10:44:00+0000") as String
Mitul Marsoniya
la source
4

rendre la fonction globale

func convertDateFormat(inputDate: String) -> String {

     let olDateFormatter = DateFormatter()
     olDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

     let oldDate = olDateFormatter.date(from: inputDate)

     let convertDateFormatter = DateFormatter()
     convertDateFormatter.dateFormat = "MMM dd yyyy h:mm a"

     return convertDateFormatter.string(from: oldDate!)
}

Fonction appelée et y passer la valeur

get_OutputStr = convertDateFormat(inputDate: "2019-03-30T05:30:00+0000")

et voici la sortie

Feb 25 2020 4:51 PM



 
Narendra Jagne
la source
1
Pensez-vous que votre entrée et votre sortie sont les mêmes?
Deepak Carpenter le
2

Dans swift4,

    var Msg_Date_ = "2019-03-30T05:30:00+0000"

    let dateFormatterGet = DateFormatter()
    dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    let dateFormatterPrint = DateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd yyyy h:mm a"  //"MMM d, h:mm a" for  Sep 12, 2:11 PM
    let datee = dateFormatterGet.date(from: Msg_Date_)
    Msg_Date_ =  dateFormatterPrint.string(from: datee ?? Date())

    print(Msg_Date_)

// sortie: - 30 mars 2019 17h30

Fuhad saneen
la source
2

juste Étape 1> obtenir la valeur String de JSON ou dataSource

Étape 2> créez une variable locale et affectez-la.

let startDate = CurrentDashBoard.startdate

Étape 3> Créez une instance de DateFormatter.

let dateFormatter = DateFormatter()

étape 4> appelez dateFormat à partir de dateFormatter et fournissez le type de données de date enregistré.

dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss"("may be String formate")

étape 5> Attribuez la variable locale à cette variable à convertir.

let dateFromStringstartDate : NSDate = dateFormatter.date(from: startDate)! as NSDate

Étape 6> Fournissez votre date requise Formatez par le code suivant.

dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"

Étape 6> Attribuez-le à l'étiquette / au texte

cell.lblStartDate.text = String(format: "%@", strstartDate)

Code:

let startDate = CurrentDashBoard.startdate let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss" let dateFromStringstartDate : 
NSDate = dateFormatter.date(from: startDate)! as NSDate
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss"
let strstartDate = dateFormatter.string(from: dateFromStringstartDate as Date)
Akshay K
la source
1

Swift 5. Pour voir SI UNE DATE EST PASSÉE:

let expiryDate = "2020-01-10" // Jan 10 2020

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

if Date() < dateFormatter.date(from: expiryDate) ?? Date() {
    print("Not Yet expiryDate")
} else {
    print("expiryDate has passed")
}
Thyselius
la source
1

Je devenais fou avec ce format aussi.

Voir la solution ci-dessous.

Votre String qui vient de votre dos ou d'une autre source:

    let isoDate = "2020-05-06 20:00:00-03"

Identifiez le format de la date

    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ssZ"
    let date = dateFormatter.date(from:isoDate)!

Maintenant que vous avez la date comme Date (), vous pouvez changer le format de votre choix en utilisant le formatDate.string

    let formatDate = DateFormatter()
    formatDate.dateFormat = "dd/MM/yyyy HH:mm"
    let drawDate = formatDate.string(from: date)
    print(drawDate)

Production:

    06/05/2020 20:00
Alan Silva
la source
0

Veuillez utiliser une bibliothèque d'analyse ISO8601 pour ce faire. Il y a trop de façons de coder la chaîne. Ne vous fiez pas à un format spécifique et ne comptez pas sur le serveur qui envoie toujours le même. Les problèmes commencent avec le «Z» à la fin et cela s'étendra à toutes les variétés de la norme. Une bibliothèque d'analyse gérera tous les cas et fournira toujours une conversion sûre - alors qu'une chaîne de mise en forme fixe est susceptible d'échouer à l'avenir.

Vous pouvez utiliser l'une de ces bibliothèques. Ils sont également disponibles sur CococaPods:

https://github.com/boredzo/iso-8601-date-formatter/

https://github.com/malcommac/SwiftDate

Jetez un œil aux implémentations. Ils font tous les deux plusieurs centaines de lignes - pour une bonne raison.

En ce qui concerne la question: vous pouvez extraire les composants de date de la date en utilisant NSDateComponents. L'exemple sur le site Web couvre exactement votre cas.

https://developer.apple.com/documentation/foundation/nscalendar/1414841-components?language=objc

Veuillez noter que la conversion de votre date prendra en compte le fuseau horaire. Vous souhaiterez peut-être définir explicitement les paramètres régionaux de NSCalendar.

thetrutz
la source
0

Utilisez simplement SwifterSwift.

stringDate = "2020-04-26T08:56:17.987Z"
let date = Date(iso8601String: stringDate)
LeoNard
la source