2015-02-26 3 views
10

я сделать HTTP GET запроса к серверу и получить обратно объект JSON с датой строкой, как это:Как мне форматировать строку даты JSON с помощью Swift?

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

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

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

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? Я хочу отображать дату и время для пользователя, чтобы они могли знать, когда было сделано чтение.

ответ

23

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

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

DO N OT цитирует 'Z'. Это даст неправильный результат. – rmaddy

+0

@rmaddy просто попробовал и не цитировал «Z», давая мне неправильный –

+0

@zellb Я могу заверить вас, что цитирование 'Z' даст неправильный результат. Если вы считаете, что получаете неправильный результат, когда не указываете «Z», вы делаете что-то еще неправильно или неправильно понимаете результат. – rmaddy

4

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

Serialize:

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

Deserialize:

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

link is dead ... – sasquatch

+1

SwiftDate можно найти по этой ссылке: https://github.com/malcommac/SwiftDate –

1

Для Преобразование 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 будет ваш String.Hope это поможет кому-то

0

Вот мой ответ, используя 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

+0

В Swift 4 я бы предпочел 'ISO8601DateFormatter' или декодировать JSON напрямую с помощью' JSONDecoder' – vadian

+0

@vad Да, использование 'JSONDecoder' будет лучше. Но, 'ISO8601DateFormatter', он не поддерживает миллисекунды. https://stackoverflow.com/questions/41847672/iso8601dateformatter-doesnt-parse-iso-date-string –

+0

В вопросе нет миллисекунд, и в macOS 10.13/iOS поддерживаются 11 миллисекунд. – vadian

3

В настоящее время (сентябрь 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!) 
    
Смежные вопросы