【发布时间】:2020-04-22 12:21:58
【问题描述】:
我有一个创建一些实体的应用程序(这对这个问题并不重要),但是可以在不同的时区创建实体,所以我必须将 UTC 偏移量存储在我的 createdAt 和 updatedAt 列中.由于某些原因,我无法正确保存生成的日期,请参考下面的代码 sn-p 以获取更多详细信息:
这是我正在做的事情:
const { user } = userInfoWebAPICallResult as WebAPICallResult
const now = moment(moment.now())
.tz(user.tz!)
.toDate();
const entity = await Entity.create({
...someData,
createdAt: now
updatedAt: now,
});
我在外部得到tz 值,它是一个看起来像“America/Los_Angeles”的字符串。如果我将now 转换为字符串(通过调用.format() 方法)并记录接收到的值,我将看到类似“2020-01-03T16:32:53-08:00”的内容。如您所见,日期具有偏移值,这是正确的日期,但在检查数据库期间我看到“2020-01-04 00:32:53.013 00”,该字符串不再具有偏移值,看起来像结果日期是自动计算出来的。
我需要通过createdAt日期实现过滤,来自不同时区的人将使用这种过滤机制。我计划通过 API 公开两个参数 date 和 utcOffset,这将允许我根据用户时区返回正确的条目。
我错过了什么?
【问题讨论】:
-
Postgres 不存储偏移量。进一步存储偏移量大约会出错 1/2 次,你也不应该。它不会考虑夏令时。您需要做的是存储 tz,然后选择 date_tims AT TIME ZONE tz。 Postgres 将自动调整夏令时。顺便说一句:你是如何检查数据库的。
-
@Belayer 感谢您的回答。有没有其他方法可以解决我的问题而不将
tz存储在数据库中?如果我将日期存储为数字,通过以下方式转换它们会怎样:` const now = moment .utc(moment.now()) .utcOffset(user.tz_offset) .unix(); ` 这应该给出一个已经与时区一致的数字关于数据库检查。我刚刚使用 TablePlus 从表中选择了所有行 -
你可能可以这样做,我什至不会考虑。我遵循非常简单的数据库规则。其中之一是日期、时间戳等,始终存储为适当的日期类型。我向你保证以后会后悔的任何其他事情。在开始使用如此复杂的系统之前,请考虑: 维护:当当前未考虑的要求是生成按周细分的过去 6 个月的报告时,您会做什么。而且,当原始开发人员离开并且文档不足或没有文档时,您希望如何继承您提出的这种设计。
-
创建
now变量的整个表达式与const now = new Date();完全相同
标签: postgresql date timezone sequelize.js utc