从 nodejs -> sequelize -> postgres,你都得设置好时区

最近在做报表统计,因为 sequelize 的时区配置没加导致了统计数字对不上的问题。

问:大家都知道时区,但是你清楚 UTC 和 GMT 的区别吗?

答:UTC 是我们现在用的时间标准,GMT 是老的时间计量标准。

(1)GMT 是根据地球的自转和公转来计算时间,也就是太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间就是中午12点

缺点:地球的自转正在缓速变慢。所以 GMT 会越来越有误差。

国外科学家认为,地球自转变慢的原因有很多,其中包括来自月球的潮汐力以及地核降温等等。预计 100 年以后每天时间会增加 1.8ms,2 亿年之后,地球上一天的是将是 25 小时。

(2)UTC 是根据原子钟来计算时间,50 亿年误差一秒,可以说非常精确。

不同环节中时区的设置

nodejs -> sequelize -> postgres

1、nodejs

(1)类 UNIX OS

process.env.TZ = 'Asia/Shanghai';

(2)mac / windows

修改系统设置,如 mac 下:

896608-20180913023523059-1809490855.png

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 

2、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、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/

原文

翻译


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值