【问题标题】:How to convert Swift Date or String to timestamp without time zone of PostgreSQL?如何在没有 PostgreSQL 时区的情况下将 Swift 日期或字符串转换为时间戳?
【发布时间】:2020-04-09 06:49:03
【问题描述】:

我的后端使用 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)

那么问题来了:如何将DateString转移到timestamp without time zone(或timestamp with time zone)?

我将不胜感激任何帮助或建议!

【问题讨论】:

    标签: swift xcode postgresql vapor postico


    【解决方案1】:

    为什么要保存没有时区的时间戳?没有时区的时间戳不是日期 - 它是一个字符串。

    任何方式 - 你只需要初始化一个没有时区的时间格式,然后用它来获取一个字符串。

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

    【讨论】:

    • 您好,感谢您的帮助,但这不起作用。如果我试图在没有时区的情况下保存字符串(如您的格式),我会收到错误:列“日期”是没有时区的时间戳类型,但表达式是文本类型
    • 我没有在服务器端使用 swift - 只有客户端。所以我不能给你一个示例代码 - 但我喜欢一个为你解释的链接 - 它更详细地告诉你我之前告诉你的内容。 razvan.net/2017/02/23/swift-on-server-part-3
    • 感谢本站,但是方法,他用的,不行。他使用 Vapor 2 和一些节点。我想,他只是用一些特殊的规则将 Date 转移到 String ,但它不起作用。现在规则改变了,我想。
    【解决方案2】:

    这不是我想要的 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 {
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 2012-10-22
      • 2021-04-01
      相关资源
      最近更新 更多