如何使用Swift格式化JSON日期字符串?

Nea*_*int 17 json nsdateformatter swift

我向服务器发出一个http get请求并返回一个带有日期字符串的json对象:

{
    name = "Place1";
    temperature = 79;
    humidity = 68;
    reported_at = "2013-07-21T19:32:00Z";
}
Run Code Online (Sandbox Code Playgroud)

我想格式化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)
Run Code Online (Sandbox Code Playgroud)

如何正确格式化Swift的日期和时间?我想向用户显示日期和时间,以便他们知道何时进行阅读.

Zel*_* B. 26

使用以下字符串格式将服务器字符串转换为Date

dateFor.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
Run Code Online (Sandbox Code Playgroud)

  • "yyyy-MM-dd'T'HH:mm:ssX"应该是正确的日期格式 (4认同)
  • 日期`2015-02-27T11:24:00Z`是格林尼治标准时间的上午11:24(这就是日期字符串中的`Z`意思).你必须住在GMT + 1时区.正确?如果不引用"Z",则在GMT时间内正确解释日期字符串.如果引用"Z",则在本地时间错误地解释日期字符串. (3认同)

vad*_*ian 16

如今(2017年9月)在Swift 4中有更智能的方法来解码ISO8601:

  • ISO8601DateFormatter

    let str = "2013-07-21T19:32:00Z"
    let formatter = ISO8601DateFormatter()
    let yourDate = formatter.date(from: str)
    
    Run Code Online (Sandbox Code Playgroud)
  • 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)
    
    Run Code Online (Sandbox Code Playgroud)