Как отформатировать строку даты JSON с помощью Swift?

Я делаю запрос http get на сервер и возвращаю объект json со строкой даты, как это:

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

Я хочу отформатировать ключ reported_at, чтобы я мог отображать читаемую дату и время для пользователя.

Это swift-код, который я пытаюсь, который продолжает возвращать ноль, так как он не может отформатировать дату.

    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)

Как правильно отформатировать эту дату и время с помощью Swift? Я хочу показать дату и время пользователю, чтобы они могли знать, когда чтение было принято.

5 ответов


используйте следующий формат строки для преобразования строки сервера в дату

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

В настоящее время (сентябрь 2017) в Swift 4 есть более умные способы декодирования 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
    
        private enum CodingKeys: String, CodingKey {
            case name, temperature, humidity
            case reportedAt = "reported_at"
        }
    }
    
    let json = """
    {"name" : "Place1", "temperature" : 79, "humidity" : 68, "reported_at" : "2013-07-21T19:32:00Z"}
    """
    let data = json.data(using: .utf8)
    
    let decoder =  JSONDecoder()
    decoder.dateDecodingStrategy = .iso8601
    let place = try! decoder.decode(Place.self, from: data!)
    

Если вы используете SwiftDate (вы, наверное, должны!) просто используйте:

сериализовать:

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

десериализовать:

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

вот мой ответ, используя extension на Swift4.

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

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat

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

Простота Использования

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

кроме того, проверьте dateFormat, который вы хотите отсюда. ISO 8601


Для Преобразования JSON строка для даты и времени в Swift 3.0 Использовать Ниже Код:-

    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будет ваша строка.Надеюсь, это поможет кому-то