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

时间:2015-02-26 16:52:25

标签: json swift nsdateformatter

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

{
    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的日期和时间?我想向用户显示日期和时间,以便他们知道何时进行阅读。

6 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:12)

如今(2017年9月)在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
    
    }
    
    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)
    

答案 2 :(得分:4)

如果您正在使用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()

答案 3 :(得分:1)

以下是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

答案 4 :(得分:0)

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它将帮助某人

答案 5 :(得分:0)

在 Swift 5 中,如果您有一个不在“iso8601”中的自定义日期字符串,您可以执行以下操作(这是 vadian 答案的变体):

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" : "2021-05-02 06:00"}
"""
let data = Data(json.utf8)

//FORMAT DATE
let dateFormatter = DateFormatter()
//Force dateFormatter to be always 24h
dateFormatter.setLocalizedDateFormatFromTemplate("HH:mm a")
dateFormatter.amSymbol = ""
dateFormatter.pmSymbol = ""
dateFormatter.locale = Locale(identifier: "en_US")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"

let decoder =  JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dateFormatter)
decoder.keyDecodingStrategy = .convertFromSnakeCase
let place = try! decoder.decode(Place.self, from: data)