web-dev-qa-db-fra.com

Comment formater JSON Date String avec Swift?

Je fais une requête http get à un serveur et récupère un objet JSON avec une chaîne de date comme celle-ci:

{
    name = "Place1";
    temperature = 79;
    humidity = 68;
    reported_at = "2013-07-21T19:32:00Z";
}

Je souhaite formater la clé de reports (Report_at) afin de pouvoir afficher une date et une heure lisibles par l'utilisateur. 

C’est le code Swift que j’essaie et qui revient sans cesse, car il ne peut pas formater la date. 

    var str = "2013-07-21T19:32:00Z"

    var dateFor: NSDateFormatter = NSDateFormatter()
    dateFor.dateFormat = "yyyy-MM-dd'T'HH:mm:ss:SSS"

    var yourDate: NSDate? = dateFor.dateFromString(str)

    println(yourDate)

Comment puis-je formater correctement la date et l'heure avec Swift? Je souhaite afficher la date et l'heure à l'utilisateur afin qu'il puisse savoir quand la lecture a été effectuée. 

15
nearpoint

Utilisez le format de chaîne suivant pour convertir une chaîne de serveur en date.

dateFor.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
24
Zell B.

De nos jours (septembre 2017), dans Swift 4, il existe des moyens plus intelligents de décoder ISO8601:

  • ISO8601DateFormatter

    let str = "2013-07-21T19:32:00Z"
    let formatter = ISO8601DateFormatter()
    let yourDate = formatter.date(from: str)
    
  • JSONDecoder

    struct Place : Decodable {
    
        let name : String
        let temperature : Int
        let humidity : Int
        let reportedAt : Date
    
    }
    
    let json = """
    {"name" : "Place1", "temperature" : 79, "humidity" : 68, "reported_at" : "2013-07-21T19:32:00Z"}
    """
    let data = Data(json.utf8)
    
    let decoder =  JSONDecoder()
    decoder.dateDecodingStrategy = .iso8601
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let place = try! decoder.decode(Place.self, from: data)
    
11
vadian

Si vous utilisez SwiftDate (vous devriez probablement!) Utilisez simplement:

Sérialiser:

let date:NSDate = ....
let dateInRegion = DateInRegion( absoluteTime: date )
let serializedString:String = dateInRegin.toString( .ISO8601Format( .Full ))!

Désérialiser:

let serializedDate:String = "2016-03-01T22:10:55.200Z"
let date:NSDate? = serializedDate.toDateFromISO8601()
4
Marchy

Voici ma réponse en utilisant extension dans Swift4.

extension String {
  func toDate(dateFormat: String) -> Date? {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat

    let date: Date? = dateFormatter.date(from: self)
    return date
}

Utilisation simple

let str = "2013-07-21T19:32:00Z";
let dateStr = str.toDate(dateFormat: "yyyy-MM-dd'T'HH:mm:ssZ")

Vérifiez également la dateFormat que vous souhaitez à partir d’ici. ISO 8601

1
Changnam Hong

Pour convertir JSON Chaîne en Date et heure dans Swift 3.0, utilisez le code ci-dessous: -

    let timeinterval : TimeInterval = (checkInTime as! NSString).doubleValue
    let dateFromServer = NSDate(timeIntervalSince1970:timeinterval)
    print(dateFromServer)
    let dateFormater : DateFormatter = DateFormatter()
    //dateFormater.dateFormat = "dd-MMM-yyyy HH:mm a"  // 22-Sep-2017 14:53 PM
    dateFormater.dateFormat = "dd-MMM-yyyy hh:mm a"   // 22-Sep-2017 02:53 PM
    print(dateFormater.string(from: dateFromServer as Date))

checkInTime sera votre String.Hope cela aidera quelqu'un

0
Dilip Tiwari