背景


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

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

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

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

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

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

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

不同环节中时区的设置


moment -> nodejs -> sequelize -> postgres

注意:推荐(中国)时区用 PRCAsia/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,你都得设置好时区的更多相关文章

  1. 有了这个,再也不用每次连新机器都要设置secure crt属性了

    我连服务器用的是secure crt,每次ssh新服务器的时候都得手动设置字符编码和背景颜色,今天问了旁边的开发原来可以全局设置,以后连服务器的时候就再也不用手动设置相关属性了.步骤如下: 一开始点击 ...

  2. 深入解析Dropout——基本思想:以概率P舍弃部分神经元,其它神经元以概率q=1-p被保留,舍去的神经元的输出都被设置为零

    深度学习网络大杀器之Dropout——深入解析Dropout  转自:https://yq.aliyun.com/articles/68901 摘要: 本文详细介绍了深度学习中dropout技巧的思想 ...

  3. nodejs sequelize 对应数据库操作符的定义

    const Op = Sequelize.Op [Op.and]: {a: } // 且 (a = 5) [Op.or]: [{a: }, {a: }] // (a = 5 或 a = 6) [Op. ...

  4. nodejs+sequelize操作mysql数据库

    前言: 本人对mysql不是很熟悉,只会命令行的简单增删改查.有些观点可能不到位请谅解. sequelize是针对node.js和io.js开发的基于ORM的框架,它支持的数据库包括:PostgreS ...

  5. (转)MyBatis在插入的数据有空值时,可能为空的字段都要设置jdbcType

    1 引言 前面的所有语句中你所见到的都是简单参数的例子,实际上参数是 MyBatis 非常强大的元素,对于简单的做法, 90% 的情况参数都很少,比如: <select id="sel ...

  6. mystar01 nodejs MVC 公共CSS,JS设置

    mystar01 nodejs MVC gulp 项目搭建 config/express.js中定义别名 //将下载的第三方库添加到静态资源路径当中,方便访问 app.use('/jquery', e ...

  7. nodejs开发微信1——微信路由设置a(access_token和tickets)

    /* jshint -W079 */ /* jshint -W020 */ "use strict"; var _ = require("lodash"); v ...

  8. Win7 和 MAC 系统通过VMware共享文件夹(简单又好用,几乎什么都不用设置)

    Win7是Server,Mac是Client,VMware上运行Mac系统 1.在VMware的Options菜单中选择Shared Folders选项 2.选择Always enabled选项 3. ...

  9. android--自己定义ProgressDialog显示位置(其他Dialog子类都能够设置)

    1.普通情况下,系统默认的Dialog显示位置为屏幕居中: pbDialog = new ProgressDialog(MainActivity.this); pbDialog.setMessage( ...

随机推荐

  1. python 函数的名称空间及作用域

    一:名称空间 1:什么是名称空间: 名称空间即:储存名字与值的内存地址关联关系的空间 2.名称空间的分类: 内置名称空间:存储器自带的一些名称与值的对应关系,如:print,len,max等; 生命周 ...

  2. <转>ajax 同步异步问题

    原文:https://blog.csdn.net/wxr15732623310/article/details/76387787 看似简单明白的问题说起来却迷迷糊糊,完全没有逻辑,说不到重点上,再来整 ...

  3. jieba分词/jieba-analysis(java版)

    简介 支持分词模式Search模式,用于对用户查询词分词Index模式,用于对索引文档分词特性支持多种分词模式全角统一转成半角用户词典功能conf 目录有整理的搜狗细胞词库因为性能原因,最新的快照版本 ...

  4. json11阅读

    概要:json11是一个基于c++11的json解析库,dropbox出品. 使用 直接举自带单元测试test.cpp中的例子: const string simple_test = R"( ...

  5. Unity 2017 Game Optimization 新版

    英文原版,PDF格式带目录,非常不错的关于性能优化的书籍 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  6. 【c++】内存检查工具Valgrind介绍,安装及使用以及内存泄漏的常见原因

    转自:https://www.cnblogs.com/LyndonYoung/articles/5320277.html Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包 ...

  7. [leetcode]56. Merge Intervals归并区间

    Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...

  8. 拉普拉斯平滑处理 Laplace Smoothing

    背景:为什么要做平滑处理? 零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0.在文本分类的问题中,当一个词语没有在训练样本中出现,该词 ...

  9. Android如何在http头信息里设置参数

    在使用http请求server时常常要传递一些参数给server,如IMEI号.平台号.渠道号.客户端的版本号等一些通用信息,像这些参数我们没有必要每次都拼在url后,我们可以统一添加到http头里. ...

  10. Python6大设计原则

    内容总览 六大设计原则都有哪些 一.单一职责原则 二.里氏替换原则 三.依赖倒置原则 四.接口隔离原则 五.迪米特法则 六.开放封闭原则 内容详解 一.单一职责原则 单一职责原则:英文名称是Singl ...