1. 程式人生 > >從 nodejs -> sequelize -> postgres,你都得設定好時區

從 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 下:

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'` 
});
 

原文

翻譯