Node::date不转换无区域的时间戳

inkz8wg9  于 2022-11-29  发布在  Node.js
关注(0)|答案(2)|浏览(133)

我正在尝试格式化时间戳,以便它只返回日期,而不像year-dd-mm那样返回时间。
我的格式如下:u.registered::date,其中u.registered是没有时区的时间戳。
在psql中,我测试了它,它确实返回日期格式,但在服务器端它仍然返回时间戳格式。
当我在pgadmin上使用db.get_mypage查询时,它显示如下。

但在节点上,当我运行console.log时,它显示

Node.js

var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');
var cors = require('cors');
var massive = require('massive');
var config = require('./config');
var app = express();

app.use(bodyParser.json());
app.use(cors());

var db = massive.connect({connectionString: config.connectionString}, function(err, localdb){
    db = localdb;
    app.set('db', db);

});

app.get('/mypage/:id', function(req, res, next) {
    db.get_mypage([req.params.id], function(err, individual) {
        console.log(individual);
        if(err) res.status(500).send(err);
        else res.send(individual);
    })
})

app.listen(3000, function() {
    console.log("I am listening");
})

数据库.获取我的页面

select u.user_id, b.book_id, u.username, b.title, b.pages, u.registered::date 
 from mypage as m
 join users u on u.user_id = m.user_id
 join book b on b.book_id = m.book_id
 where u.user_id = $1;
xj3cbfub

xj3cbfub1#

我不认为问题出在数据库中。PgAdmin显示表明数据库正在生成一真实的date值,所以这没问题。问题看起来像是数据库中的值正在被转换为原生JavaScript Date。但Date实际上是完整的时间戳,Date的时间部分默认为00:00:00:

> new Date(2017, 4, 10).toISOString()
  "2017-05-10T07:00:00.000Z"
> new Date('2017-04-10').toISOString()
  "2017-04-10T00:00:00.000Z"

看起来您的库使用的是Date构造函数的new Date(y, m, d)形式。
JavaScript中没有不带时间的日期,因此您可能需要使用字符串。您可以在查询中使用to_char来获取ISO8601日期字符串:

select ..., to_char(u.registered, 'YYYY-MM-DD')

这样可以更好地控制应用的时区。或者,可以确保应用程序的本地时区是UTC,这样您就可以只在应用程序的边缘(即显示和输入)担心时区问题。

kxe2p93d

kxe2p93d2#

原因是pgmassive使用的引擎)默认将 datetimestamp without time zonetimestamp with time zone 转换为原生JavaScript Date对象。但是原生Date对象没有分隔日期和时间。新的Temporal对象可以做到这一点,但是在编写本文时它还处于第3阶段。
通过改变类型解析器,可以使pg返回类型为 date 和 *timestamp(不带时区 *)的字段作为字符串:

import pg from 'pg';

pg.types.setTypeParser(pg.types.builtins.DATE, (d) => d);
pg.types.setTypeParser(pg.types.builtins.TIMESTAMP, (d) => d);

我不知道是否巨大剂量的东西额外,但希望你知道什么寻找。

相关问题