为啥从 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 3 到 Vapor 4 的 LingoVapor 包