簡體   English   中英

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

[英]How do I format JSON Date String with Swift?

我向服務器發出一個 http get 請求,並返回一個帶有日期字符串的 json 對象,如下所示:

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

我想格式化reported_at 鍵,以便向用戶顯示可讀的日期和時間。

這是我正在嘗試的 swift 代碼,它不斷返回 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 正確格式化此日期和時間? 我想向用戶顯示日期和時間,以便他們知道讀取時間。

使用以下字符串格式將服務器字符串轉換為日期

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

如今(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)

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

這是我在Swift4使用extensionSwift4

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

要在Swift 3.0中將JSON字符串轉換為日期和時間,請使用以下代碼:-

    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 它將幫助某人

在 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM