從 nodejs -> sequelize -> postgres,你都得設定好時區
阿新 • • 發佈:2018-12-09
背景
最近在做報表統計,因為 sequelize 的時區配置沒加導致了統計數字對不上的問題。
問:大家都知道時區,但是你清楚 UTC 和 GMT 的區別嗎?
答:UTC
是我們現在用的時間標準,GMT
是老的時間計量標準。
(1)GMT
是根據地球的自轉和公轉來計算時間,也就是太陽每天經過位於英國倫敦郊區的皇家格林威治天文臺的時間就是中午12點
缺點:地球的自轉正在緩速變慢。所以 GMT 會越來越有誤差。
國外科學家認為,地球自轉變慢的原因有很多,其中包括來自月球的潮汐力以及地核降溫等等。預計 100 年以後每天時間會增加 1.8ms,2 億年之後,地球上一天的是將是 25 小時。
(2)UTC
不同環節中時區的設定
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'`
});