从 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/


从 moment -> nodejs -> sequelize -> postgres,你都得设置好时区的更多相关文章
- 有了这个,再也不用每次连新机器都要设置secure crt属性了
我连服务器用的是secure crt,每次ssh新服务器的时候都得手动设置字符编码和背景颜色,今天问了旁边的开发原来可以全局设置,以后连服务器的时候就再也不用手动设置相关属性了.步骤如下: 一开始点击 ...
- 深入解析Dropout——基本思想:以概率P舍弃部分神经元,其它神经元以概率q=1-p被保留,舍去的神经元的输出都被设置为零
深度学习网络大杀器之Dropout——深入解析Dropout 转自:https://yq.aliyun.com/articles/68901 摘要: 本文详细介绍了深度学习中dropout技巧的思想 ...
- nodejs sequelize 对应数据库操作符的定义
const Op = Sequelize.Op [Op.and]: {a: } // 且 (a = 5) [Op.or]: [{a: }, {a: }] // (a = 5 或 a = 6) [Op. ...
- nodejs+sequelize操作mysql数据库
前言: 本人对mysql不是很熟悉,只会命令行的简单增删改查.有些观点可能不到位请谅解. sequelize是针对node.js和io.js开发的基于ORM的框架,它支持的数据库包括:PostgreS ...
- (转)MyBatis在插入的数据有空值时,可能为空的字段都要设置jdbcType
1 引言 前面的所有语句中你所见到的都是简单参数的例子,实际上参数是 MyBatis 非常强大的元素,对于简单的做法, 90% 的情况参数都很少,比如: <select id="sel ...
- mystar01 nodejs MVC 公共CSS,JS设置
mystar01 nodejs MVC gulp 项目搭建 config/express.js中定义别名 //将下载的第三方库添加到静态资源路径当中,方便访问 app.use('/jquery', e ...
- nodejs开发微信1——微信路由设置a(access_token和tickets)
/* jshint -W079 */ /* jshint -W020 */ "use strict"; var _ = require("lodash"); v ...
- Win7 和 MAC 系统通过VMware共享文件夹(简单又好用,几乎什么都不用设置)
Win7是Server,Mac是Client,VMware上运行Mac系统 1.在VMware的Options菜单中选择Shared Folders选项 2.选择Always enabled选项 3. ...
- android--自己定义ProgressDialog显示位置(其他Dialog子类都能够设置)
1.普通情况下,系统默认的Dialog显示位置为屏幕居中: pbDialog = new ProgressDialog(MainActivity.this); pbDialog.setMessage( ...
随机推荐
- Python基础-python数据类型之字符串(四)
字符串 字符串是python中常用的数据类型,使用('或")来创建. 创建字符串: 下标索引 字符串实际上是字符的数组,所以也支持索引. str1 = 'abcdef' 切片 定义:切片是指 ...
- js 面向对象的三大特性
一.封装 所谓封装的概念,是不希望暴露函数中属性或者方法的地址,使外界不能操作,但是可以暴露特有的公有接口,可以利用接口操作. function hello(){ var name='xiaoming ...
- PHP请求ws出现的问题
在SOAPUI中的请求如下: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/&qu ...
- c#Dapper 批量插入Mysql
<connectionStrings> <add name="sqlconnectionString" connectionString="server ...
- day 5,格式化输出,for,while, break,continue,列表
本节内容: 1,格式化输出 2,数据类型 3,for 循环 4,while 循环 5,列表 pycharm的简单使用,设置pycharm自动生成日期和计算机用户名 ctrl+d复制一行 1,格式化输出 ...
- python小结 1
1.变量 记录状态 类型:数字,字符串,元组,列表,字典 可变不可变(内存地址不变的情况下,值能不能改变): 不可变:字符串,数字,元组 可变:列表,字典 访问顺序: 直接访问:数字 有序:字符串,列 ...
- leveldb 学习记录(四) skiplist补与变长数字
在leveldb 学习记录(一) skiplist 已经将skiplist的插入 查找等操作流程用图示说明 这里在介绍 下skiplist的代码 里面有几个模块 template<typenam ...
- laravel控制器之资源控制器
资源控制器 Laravel 的资源控制器可以让我们很便捷地构建基于资源的 RESTful 控制器,例如,你可能想要在应用中创建一个控制器,用于处理关于文章存储的 HTTP 请求,使用 Artisan ...
- 深拷贝 deepAssign
实现代码: <script type="text/javascript"> Object.deepAssign = function() { var args = Ar ...
- HTML-表格-列表-结构标记-表单
1.表格 1.表格语法 1.标记 1.表格 <table></table> 2.行 <tr></tr& ...