如何使用 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"
如果您正在使用 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()
要将 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 它将帮助某人
这是我在 Swift4
中使用 extension
的答案。
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")
另外,从这里检查你想要的日期格式。 ISO 8601
如今(2017 年 9 月)在 Swift4 中有更智能的方法来解码 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)
在 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)
我向服务器发出一个 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"
如果您正在使用 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()
要将 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 它将帮助某人
这是我在 Swift4
中使用 extension
的答案。
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")
另外,从这里检查你想要的日期格式。 ISO 8601
如今(2017 年 9 月)在 Swift4 中有更智能的方法来解码 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)
在 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)