为啥从 Psql 通过 Swift (Vapor) 到通过 Ajax 的 JQuery 的日期落后了 31 年?

Posted

技术标签:

【中文标题】为啥从 Psql 通过 Swift (Vapor) 到通过 Ajax 的 JQuery 的日期落后了 31 年?【英文标题】:Why is date from Psql through Swift (Vapor) to JQuery via Ajax 31 years behind?为什么从 Psql 通过 Swift (Vapor) 到通过 Ajax 的 JQuery 的日期落后了 31 年? 【发布时间】:2021-10-08 09:22:21 【问题描述】:

在 Swift (Vapor) 服务器中,我从 Postgres 数据库中检索具有日期字段的对象。数据的正确性在数据库中得到验证。然后我对对象进行编码:

    func sendToSocket(_ game: Game) 
    if Network.ownerWS == nil  return 
    var payload : String = ""
    do 
        payload = try String( data: JSONEncoder().encode(game), encoding: .utf8)!
     catch 
        print("oops couldn't encode payload")
    
    Network.ownerWS!.send(payload)
    

这会通过网络套接字将生成的对象发送到监控屏幕。

在该客户端上,消息由 JS/JQuery 函数接收,这很好:

     ws.onmessage = function (evt) 
        var received_msg = evt.data;
         var game = JSON.parse(received_msg)
         console.log(received_msg)
         …
         console.log(game.started)
         console.log(new Date(game.started * 1000))
         let format = [day: 'numeric', month: 'short'];
         var started = new Date(game.started, format);
         var ended = new Date(game.ended);
         console.log("started: " + started + " ended: " + ended)
         …
     ;

第一次日志调用产生预期值:

custom.js:16"player":"id":"6CCE3047-8080-4793-83C0-   C634C9E73AE1","score":34,"id":"4EA10020-79C6-46D0-AAD7-EC3E5C271E0D","moves":25,"match":"id":"93D1319D-A258-4F9D-AC6E-B4860F95D948","updatedAt":649664452.29815102,"createdAt":649589977.37518704,"ended":null,"started":649661807.94521403

这似乎是我的问题似乎开始的地方。开始的数值似乎不熟悉:它是从原始 Postgres 值以某种方式转换的,我不知道这是什么格式。

第二个日志条目显示来自 JSON 的值,第三个日志条目显示的日期正好是正确的原始日期前 31 年:

    Fri Aug 03 1990 12:36:47 GMT+0700 (+07)

31 年的确切精度似乎是一些我不理解的格式约定。有没有人了解这里的异常情况?

这段代码的基本目标——更新页面上的值——在不涉及日期时可以正常工作。

编辑:仅供参考,来自 postgres 的架构:

    Column   |           Type           | Collation | Nullable |
 Default 
 ------------+--------------------------+-----------+----------+---------  
id      | uuid                     |           | not null |   
match   | uuid                     |           | not null |   
player  | uuid                     |           | not null |   
started | timestamp with time zone |           |          |   
ended   | timestamp with time zone |           |          |   
score   | bigint                   |           |          |   
moves   | bigint                   |           |          |
created_at |timestamp with time zone |         |          |
updated_at |timestamp with time zone |         |          |

【问题讨论】:

在 epochconverter.com 649589977 转换为 Fri Aug 03 1990 12:36:47 GMT+0700 。所以它工作正常。 en.wikipedia.org/wiki/System_time ?检查您处理的参考日期? 这是什么? game.started * 1000 澄清一下,如果您在服务器端打印payload,那么您的日期键会得到什么值? Postgres 中日期字段的数据类型是什么? Postgres 中显示的数据值是多少?在 Postgres select to_timestamp(649661807.94521403); 1990-08-02 22:36:47.945214-07(在我的时区美国/太平洋)。将 JS Date 转换为毫秒会产生相同的结果。 【参考方案1】:

我正在积极关注这里的任何答案,但今天的截止日期让我无法解决问题:我会围绕它转圈,但也会尝试回答任何问题或想法......

【讨论】:

以上是关于为啥从 Psql 通过 Swift (Vapor) 到通过 Ajax 的 JQuery 的日期落后了 31 年?的主要内容,如果未能解决你的问题,请参考以下文章

Vapor 不适用于 xcode 9 和 swift 4

从 Vapor 3 到 Vapor 4 的 LingoVapor 包

在纯 Swift (Vapor) 项目中拥有 HMAC SHA256

swift [Vapor 3.0模型模板] #vapor3

Vapor 3 Swift 4 如何制作计时器

Swift 3 如何使用 Vapor 发送多部分发布请求