从 moment -> nodejs -> sequelize -> postgres,你都得设置好时区
背景#
最近在做报表统计,因为 sequelize 的时区配置没加导致了统计数字对不上的问题。
问:大家都知道时区,但是你清楚 UTC 和 GMT 的区别吗?#
答:UTC
是我们现在用的时间标准,GMT
是老的时间计量标准。
(1)GMT
是根据地球的自转和公转来计算时间,也就是太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间就是中午12点
缺点:地球的自转正在缓速变慢。所以 GMT 会越来越有误差。
国外科学家认为,地球自转变慢的原因有很多,其中包括来自月球的潮汐力以及地核降温等等。预计 100 年以后每天时间会增加 1.8ms,2 亿年之后,地球上一天的是将是 25 小时。
(2)UTC
是根据原子钟来计算时间,50 亿年误差一秒,可以说非常精确。
不同环节中时区的设置#
moment -> nodejs -> sequelize -> postgres
注意:推荐(中国)时区用 PRC
、Asia/Shanghai
而不是 +08:00
。因为时区和时区惯例受政治决策的影响,而不仅仅是地球几何。世界各地的时区在 20 世纪初变得有些标准化,但仍然容易发生任意变化。
1、moment#
使用Moment Timezone
库:
const moment = require('moment-timezone');
moment.tz.setDefault('Asia/Shanghai');
2、nodejs#
(1)类 UNIX OS
process.env.TZ = 'Asia/Shanghai';
(2)mac / windows
修改系统设置,如 mac 下:
moment().format("YYYY-MM-DD HH:mm:ss Z")
//2018-09-13 01:44:09 +08:00
// 修改时区
moment().format("YYYY-MM-DD HH:mm:ss Z")
//2018-09-12 18:44:25 +01:00
3、postgres#
(1)配置文件
postgresql.conf
timezone = 'PRC'
(2)postgres CLI
set timezone = 'xxx'
注:postgres 底层存的是 UTC 时间,set timezone 只是改变了数据库展示时间的方式(带时区)
show timezone // postgres 默认为 PRC ( = Asia/Shanghai)
select "activatedAt" from "Members" where id = '373'
//2018-07-26 07:13:38.291+08
//修改时区
set timezone='UTC'
show timezone // UTC
select "activatedAt" from "Members" where id = '373'
//2018-07-25 23:13:38.291+00
(3)query
AT TIME ZONE
—— 转换时区
-- 1、timestamp + AT TIME ZONE = timestamptz
select timestamp '2018-08-16 20:12:16' AT TIME ZONE '+08:00';
-- 2018-08-17 12:12:16+08
-- 2、timestamptz + AT TIME ZONE = timestamp
select timestamptz '2018-08-16 20:12:16+08' AT TIME ZONE '+08:00';
-- 2018-08-16 04:12:16
4、sequelize#
timezone: '+08:00'
let sequelize = new Sequelize(config.database, config.username, config.password, {
"username": "username",
"password": "password",
"database": "database",
"host": "127.0.0.1",
"port": 5432,
"dialect": "postgres",
timezone: '+08:00', // 等同于 postgres 的 `set timezone = 'xxx'`
});
参考文档:https://sequelize.readthedocs.io/en/latest/api/sequelize/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?
· 告别虚拟机!WSL2安装配置教程!!!