我不太了解时间戳的用法,
例如
用户创建文章可以选择 PublishDate
,系统也会自动存储 CreateDate
。
一种。我应该使用时区制作 PublishDate
和 CreateDate
时间戳并设置 utc 吗?
湾用户发布字符串,然后我像下面这样转换使用 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';
湾用户提交帖子到商店(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: 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 将在执行时从服务器获取时间戳。
关于javascript + postgres : timezone and timestamp usage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32033114/