[英]How do I convert Postgres dates to ISO8601 in JSON responses with Vapor 3 running on Heroku?
我在 Heroku 上有一個 Vapor 3 API。 不幸的是,它沒有正確處理日期。 最初,我認為在 Vapor 中為了簡單起見,我可以將日期視為字符串,如下所示:
struct MyModel {
var time: String?
}
但是每當我從數據庫中獲取MyModel
並返回它時, time
鍵根本不會出現(而其他鍵和值沒有問題)。 我以為我可以將time
的類型更改為Date
,但這導致了同樣的事情,並且我已經使用ContentConfig
將JsonEncoder.dateEncodingStrategy
設置為.iso8601
(同樣,沒有運氣 - 也許是因為dateEncodingStrategy
only在 Linux 上支持millis,這是 Heroku 使用的?)。
如何在 Heroku 上運行 Vapor 3 的情況下將 Postgres 日期轉換為 json 格式的 ISO8601?
搞定了! 只是將屬性更改為Date
s,並手動將請求查詢參數也轉換為Date
s(用於filter
調用)。 所以,比 Vapor 3 中的大多數東西都要多一點手工,但並不可怕。
例如我的模型現在看起來像這樣:
struct MyModel {
var time: Date?
}
然后當我嘗試按日期過濾時,我會執行以下操作:
var builder = MyModel.query(on: req)
if let afterString: String = try? self.query.get(String.self, at: "after") {
let afterDate: Date? = DateFormatter.iso8601Full.date(from: afterString)
builder = builder.filter(\.time > afterDate)
}
其中after
是一個 url 參數,而DateFormatter.iso8601Full
是我的 iso8601 日期格式化程序。 然后,當我在響應中返回MyModel
數組時,我將該數組映射到MyModelResponseObject
數組,如下所示:
struct MyModelResponseObject {
var time: String?
}
通過做這樣的事情:
myModelsFuture.all().map(to: [MyModelResponseObject].self, { (myModels) -> [MyModelResponseObject] in
return myModels.map { it in
return MyModelResponseObject(time: DateFormatter.iso8601Full.string(from: it.time ?? Date.init(timeIntervalSince1970: 0)))
}
}
所以基本上我手動將日期轉換為我在 JSON 中返回它們時想要的格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.