Javascript + postgres:使用时区和时间戳
javascript + postgres: timezone and timestamp usage
我不太明白时间戳的用法,
例如
用户创建文章,可以选择PublishDate
,系统也自动存储CreateDate
。
。我应该让PublishDate
和CreateDate
的时间戳与时区和设置utc?
b。用户发布字符串,然后我转换像下面使用momentjs
utc时间戳和存储,当有人选择这一行,显示他们作为用户客户端时间反向使用momentjs
c。我使用CURRENT_TIMESTAMP
到CreateDate
, CURRENT_TIMESTAMP
是否意味着服务器时间?我做的对吗?
我的想法是我总是插入utc时区时间戳到数据库,无论在哪里用户/客户端读取,将数据转换为用户/客户端时区?我做的对吗?
。我的数据库(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。用户提交文章到存储(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。用CURRENT_TIMESTAMP
插入CreateDate
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: date/time field value out of range: "1439717298"]
name: 'error',
length: 158,
severity: 'ERROR',
code: '22008',
detail: undefined,
hint: 'Perhaps you need a different "datestyle" setting.',
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'datetime.c',
line: '3775',
routine: '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);
}
});
});
};
最简单的方法是始终存储不带时区的UTC时间戳。这样就很容易使用它们进行显示和计算。差值只是一个减法,比较直接进行。
如果列是带时区的时间戳,那么输入将被转换为UTC,但输出将在当前设置的时区中,如果设置不正确,可能会显示错误的值。它还会降低数据库的效率。
在表示层中,时间戳可以以适当的时区显示,输入的值也可以转换为UTC进行存储。
这是处理时间戳最简单、最有效、最灵活的方法。
使用CURRENT_TIMESTAMP将在执行时从服务器获取时间戳。
传入的没有时区的时间戳是用本地时间而不是UTC来解析的——我认为这是node-postgres中的一个bug。无论如何,您可以通过添加以下代码来重写它以做正确的事情:
pg.types.setTypeParser(1114, function(stringValue) {
console.log(stringValue);
return new Date(Date.parse(stringValue + "+0000"));
})
- 如何在时间标签和相同的类中以UTC格式重新格式化ISO 8601时间戳,并通过JavaScript根据用户区域设置和时区
- 时刻.js时区值返回错误的时间戳
- 使用 JavaScript 的客户端日期/时间戳一致(考虑时区)
- 如何将 unix 时间戳转换为 JavaScript 日期对象(考虑时区)
- 如何使用 javascript 在没有时区列的 Postgis 时间戳中插入当前时间戳
- 如何使用客户端时区将数据库时间戳输出为客户端中的日期戳
- 转换时区会产生相同的时间戳
- 没有时区的PostgreSQL字段时间戳 - 如何检查它是否等于今天
- 如何将“字符串”转换为“没有时区的时间戳”
- 从特定时区获取当前时间戳
- 获取UTC时区's在javascript中的时间戳
- 将时间戳转换为日期会在结果中显示不同的时区
- 用javascript将unix日期时间戳转换为特定时区的时间
- 获取特定时区中最后12点的时间戳
- 为什么我的时刻.js不计算时间在不同的时区基于给定的时间戳
- 我应该如何在服务器端存储来自JS的时间戳,以便我可以可靠地使用它转换为其他时区?
- javascript获取系统时区的时间戳,而不是UTC
- 时间戳日期时区问题在dojo
- 如何更改这个jquery插件的时区/时间戳
- 在Node.JS中输出用户所在时区时间戳的最佳方法