当前位置: 首页 > 知识库问答 >
问题:

javascript+Postgres:时区和时间戳的使用

夹谷浩博
2023-03-14

我不太理解时间戳的用法,
例如
用户创建文章,他们可以选择publishdate,系统也会自动存储createdate

a.我是否应该使publishdatecreatedate具有时区并设置UTC的时间戳?

b.用户post字符串,然后将其转换为utc时间戳,如下所示使用MomentJS并存储,当某人选择这一行时,将其显示为用户客户端时间反向使用MomentJS

c.我使用current_timestampcreatedatecurrent_timestamp是不是意味着服务器时间?我做得对吗?

我的想法是,我总是在数据库中插入utc时区时间戳,无论用户/客户端读取的地方,都将数据转换为用户/客户端时区?我做得对吗?

a.我的数据库(postgres)创建者

CREATE TABLE IF NOT EXISTS "Article"(
"ArticleId" SERIAL NOT NULL,
"PublishDate" timestamp with time zone,
"Active" bit NOT NULL,
"CreateByUserId" integer,
"CreateDate" timestamp with time zone,
PRIMARY KEY ("ArticleId")
);

SET timezone = 'UTC';

b.用户将post提交到存储(nodejs)

// publishDate: '{"y":2015,"m":8,"d":16,"h":15,"mi":46,"s":24}
var publishDate = JSON.parse(req.body.publishDate); 

var leadingZeroAndDateFormat = function(publishDate) {
  return new Promise(function (fulfill, reject){
    if (publishDate.m < 10) { publishDate.m = '0'+publishDate.m; }
    if (publishDate.d < 10) { publishDate.d = '0'+publishDate.d; }
    if (publishDate.h < 10) { publishDate.h = '0'+publishDate.h; }
    if (publishDate.mi < 10) { publishDate.mi = '0'+publishDate.mi; }
    if (publishDate.s < 10) { publishDate.s = '0'+publishDate.s; }
    var str = publishDate.y+'-'+publishDate.m+'-'+publishDate.d+' '+publishDate.h+':'+publishDate.mi+':'+publishDate.s;
    var utc = moment(str).unix();
    fulfill(utc);
  });
};

c.将createdate插入数据库使用current_timestamp

var insertArticle = function(publishDate, active, createByUserId) {
return new Promise(function (fulfill, reject){
  var query = 'INSERT INTO "Article" ("PublishDate","Active","CreateByUserId","CreateDate") VALUES ($1,$2,$3,CURRENT_TIMESTAMP) RETURNING "ArticleId"';
  dbClient.query(query,[publishDate,active,createByUserId], function(error, result) {
    if (error) {
      reject(error);
    } else {
      fulfill(result);
    }
  });
});
};

更新
当我更改不带时区的所有列时,执行insertarticle显示错误

{[error:日期/时间字段值超出范围:“1439717298”]名称:“error”,长度:158,严重性:“error”,代码:“22008”,详细信息:未定义,提示:“可能需要不同的”datestyle“设置.”,位置:未定义,InternalPosition:未定义,InternalQuery:未定义,Where:未定义,架构:未定义,表:未定义,列:未定义,数据类型:未定义,约束:未定义,文件:“datetime.c”,行:“3775”,例程:“datetimeParseError”}

var insertArticle = function(publishDate, active, createByUserId) {
return new Promise(function (fulfill, reject){
  var query = 'INSERT INTO "Article" ("PublishDate","Active","CreateByUserId","CreateDate") VALUES ($1,$2,$3,$4) RETURNING "ArticleId"';
  dbClient.query(query,[publishDate,active,createByUserId,moment.utc().unix()], function(error, result) {
    if (error) {
      reject(error);
    } else {
       fulfill(result);
    }
  });
});
};

共有2个答案

仲孙德惠
2023-03-14

没有时区的传入时间戳是在本地时间而不是UTC中解析的--我认为这是node-postgres中的bug。无论如何,您可以通过添加以下代码重写它来做正确的事情:

pg.types.setTypeParser(1114, function(stringValue) {
    console.log(stringValue);
    return new Date(Date.parse(stringValue + "+0000"));
})
子车海
2023-03-14

最简单的方法是始终存储不带时区和以UTC形式存储的时间戳。这样就可以很容易地使用它们进行显示和计算。差异只是一个减法,直接进行比较。

如果列是带有时区的时间戳,那么输入将被转换为UTC,但输出将处于当前设置的时区中,如果设置不正确,则可能会显示错误的值。这也降低了数据库的效率。

在表示层中,时间戳可以在适当的时区中显示,输入的值也可以转换为UTC存储

这是处理时间戳的最简单、最有效和最灵活的方法。

使用CURRENT_TIMESTAMP将在执行时从服务器获取时间戳。

 类似资料:
  • 问题似乎在这个文件中:https://github.com/brianc/node-postgres/blob/master/lib/types/textparsers.js 如果从Postgres返回的日期字符串没有指定时区(例如或),那么它只会构造一个JavaScript日期对象,我相信它只会包括本地时区。

  • 问题内容: 我在Postgres的平等问题上遇到了麻烦。 平等的工作方式与我期望的一样,如果在对时区进行归一化之后,如果时间相同,那么它应该为真: 但是,似乎不适用于以下情况: 但是,不平等在我期望他们如何实现的过程中起作用: 我有什么误会吗?如何以与平等相同的方式处理时区来评估平等? 问题答案: 以下是两种评估平等的方法: 在 第一个 将它添加到一个。该 第二 通过使用构建体。 但不要使用。曾经

  • 然后将变量持久化到MySQL表列中。 然而,虽然通过调试,我看到对象显示在正确的时区GMT+1,但在数据库上持久化时,它是一个GMT时区,所以要追溯一个小时。 使用函数返回一个GMT+1日期。 连接字符串为,没有任何参数。 编辑:找到这段代码

  • 看起来(也许我错了),如果您想要保留JDBC和Postgres发生的事情的时区,您需要将时区与时间戳分开存储。 也就是说,我更愿意给我的ORM/JDBC/JPA一个Java(或Joda),其中包括时间区域到Postgres字段。我希望在检索时,不管服务器的时区(或默认为UTC)如何,都能返回一个,时区为。但只需看看大多数JDBC代码(以及依赖于它的事情不会发生)。 这是正确的吗? 当postgre

  • 我正在开发一个带有MySQL数据库的Java应用程序,该数据库位于与我的服务器不同的时区,我正试图决定在我的数据库上使用DATETIME还是TIMESTAMP。 在阅读了诸如我应该使用字段'datetime'还是'TIMESTAMP'之类的问题,以及MySQL文档之后,我认为TIMESTAMP更适合我,因为它将值转换为UTC以存储,并返回到当前时区以进行检索。 此外,正如用户Jesper在本文中所