如何将 Swift Date 或 String 转换为没有 PostgreSQL 时区的时间戳?
How to convert Swift Date or String to timestamp without time zone of PostgreSQL?
我的后端使用 Vapor 3、Swift 5.1、PostgreSQL 12 和 Postico 1.5.10。在 PostgreSQL 数据库中,有一个字段名称为 eventDate
,类型为 timestamp without time zone
。
请看截图:
在 Vapor 中,有一个模型:
import Vapor
import FluentPostgreSQL
final class TestModel: PostgreSQLModel {
var id: Int?
var eventDate: Date
init(eventDate: Date) {
self.eventDate = eventDate
}
}
extension TestModel: Content {
}
extension TestModel: Migration {
}
extension TestModel: Parameter {
}
但是当我试图将 Date
(Swift) 保存到 timestamp without time zone
时,Vapor 给我错误:
[ ERROR ] DecodingError.typeMismatch: Value of type 'String' required for key 'eventDate.date'. (NIOServer.swift:104)
如果在模型中,我将 Date
更改为 String
,Vapor 会给我这个错误:
[ ERROR ] PostgreSQLError.server.error.transformAssignedExpr: column "eventDate" is of type timestamp without time zone but expression is of type text (NIOServer.swift:104)
所以问题是:如何将Date
和String
转成timestamp without time zone
(或timestamp with time zone
)?
如有任何帮助或建议,我将不胜感激!
为什么不带时区保存时间戳?没有时区的时间戳不是日期 - 它是一个字符串。
无论如何 - 你只需要初始化一个没有时区的时间格式,然后用它来获取一个字符串。
let formatter = DateFormatter()
// initially set the format based on your datepicker date / server String
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let myString = formatter.string(from: Date())
这不是我想要的 100% 解决方案,但它也非常好。
import Vapor
import FluentPostgreSQL
final class TestModel: PostgreSQLModel {
static var createdAtKey: TimestampKey? = \.createdAt
var id: Int?
var someValue: Int
var someOtherProprty: String
var createdAt: Date?
init(someValue: Int, someOtherProprty: String) {
self.someValue = someValue
self.someOtherProprty = someOtherProprty
}
}
extension TestModel: Content {
}
extension TestModel: Migration {
}
extension TestModel: Parameter {
}
我的后端使用 Vapor 3、Swift 5.1、PostgreSQL 12 和 Postico 1.5.10。在 PostgreSQL 数据库中,有一个字段名称为 eventDate
,类型为 timestamp without time zone
。
请看截图:
在 Vapor 中,有一个模型:
import Vapor
import FluentPostgreSQL
final class TestModel: PostgreSQLModel {
var id: Int?
var eventDate: Date
init(eventDate: Date) {
self.eventDate = eventDate
}
}
extension TestModel: Content {
}
extension TestModel: Migration {
}
extension TestModel: Parameter {
}
但是当我试图将 Date
(Swift) 保存到 timestamp without time zone
时,Vapor 给我错误:
[ ERROR ] DecodingError.typeMismatch: Value of type 'String' required for key 'eventDate.date'. (NIOServer.swift:104)
如果在模型中,我将 Date
更改为 String
,Vapor 会给我这个错误:
[ ERROR ] PostgreSQLError.server.error.transformAssignedExpr: column "eventDate" is of type timestamp without time zone but expression is of type text (NIOServer.swift:104)
所以问题是:如何将Date
和String
转成timestamp without time zone
(或timestamp with time zone
)?
如有任何帮助或建议,我将不胜感激!
为什么不带时区保存时间戳?没有时区的时间戳不是日期 - 它是一个字符串。
无论如何 - 你只需要初始化一个没有时区的时间格式,然后用它来获取一个字符串。
let formatter = DateFormatter()
// initially set the format based on your datepicker date / server String
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let myString = formatter.string(from: Date())
这不是我想要的 100% 解决方案,但它也非常好。
import Vapor
import FluentPostgreSQL
final class TestModel: PostgreSQLModel {
static var createdAtKey: TimestampKey? = \.createdAt
var id: Int?
var someValue: Int
var someOtherProprty: String
var createdAt: Date?
init(someValue: Int, someOtherProprty: String) {
self.someValue = someValue
self.someOtherProprty = someOtherProprty
}
}
extension TestModel: Content {
}
extension TestModel: Migration {
}
extension TestModel: Parameter {
}