javascript与mongodb的日期时区问题
默认情况下,js的日期生成是当地时区,但默认显示是按照GMT显示的:
> var c = new Date('2017-10-31 06:00:00');
> c
2017-10-30T22:00:00.000Z
但是日期对象中有时区信息,可以获取:
> c.getTimezoneOffset()
-480 // 以分钟为单位 晚于GMT则为正,早于则为负
在获取关于日期/时间/星期等信息是按照当地时区的日期来获取的
> c.getDate();
31
> c.getHours();
6
但是要注意的是,时间戳永远是按照GMT来统计的,即按照1970-01-01T00:00:00.000Z开始算的毫秒数
> c.getTime();
1509400800000
> 1509400800000 / (60*60*1000*24) % 10000 % 1000 %100 %10 % 1 * 24
22.000000000029104
也就是说,按照时间戳来算的话现在是晚上22点。
不过一般情况下,直观上都是将时间戳转换成格式化的时间来显示。
同样的mongodb的时间也是有时区信息的,也就是GMT时区,程序中的代码在写入数据库的时候会自动的转换成GMT保存,而在查询的时候也会像在js中那样显示。
这种显示在绝大多数情况夏不会引起问题,只要在程序中保证使用的是本地时区,解释器和数据库驱动会自动去处理。
极少遇到的一个困境是使用数据库本身的聚合操作进行统计的情况:
假设我要使用mongodb的group聚合方法来统计每天创建的document的数量,如果按照如下处理的话,会出现问题:
db.sales.aggregate(
[
{
$group : {
_id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } },
totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)
这里的聚合是按照数据库的时区来处理的,也就是会按照GMT时区来进行聚合,造成的结果是本地时区00:00-08:00的数据会后退一天,而我们期望的结果是按照当地时区的日期来统计数据。
一个解决问题是在group之前对日期进行处理,先将日期加上时区偏差,然后再进行group:
db.sales.aggregate(
[
{
$group : {
_id : { month: { $month: { "$add": [ "$date", 28800000] } }, day: { $dayOfMonth: { "$add": [ "$date", 28800000] } }, year: { $year: { "$add": [ "$date", 28800000] } } },
totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)
这样以后进行group之后的日期就是按照本地时区来统计的,其中28800000 = 8 * 60 * 60 * 1000,东8时区。
javascript与mongodb的日期时区问题的更多相关文章
- javascript+php实现根据用户时区显示当地时间的方法
本文实例讲述了javascript+php实现根据用户时区显示当地时间的方法.分享给大家供大家参考.具体如下: 在跨时区应用中会用到下面代码,这是以前写的一段代码. 服务器保存相关时间配置,保存形式为 ...
- JavaScript 中如何将日期格式化为 DD/MM/YYYY
在 JavaScript 中要将日期格式化为 dd/mm/yyyy .需要遵循以下步骤: 使用 getDate().getMonth() 和 getFullYear() 方法获取特定日期的日.月和年. ...
- MongoDb查询日期范围
{"AdID":"2", "CrateDate":{"$gte":ISODate("2014-10-12T16 ...
- mongodb按照日期分组统计
目录 1.使用时间格式化方法 2.进行时间补偿(默认当前时区是东八区,即8x3600x1000=28800000) mongodb的默认时间是格林尼治时间,如果是要按照日期进行分组需要注意!!!. 解 ...
- Javascript Date 判断输入日期是否正确
JavaScript的Date对象有容错性,可将随意给定的日期的年月日自动生成正确的日期时间 //JavaScript中Date对象容错性 function dateCheck(){ var date ...
- javascript 计算两个日期的差值
代码 Typescript版 /** * TimeSpan just like the class TimpSpan in C# ,represent the time difference * @c ...
- JavaScript初探系列之日期对象
时间对象是一个我们经常要用到的对象,无论是做时间输出.时间判断等操作时都与这个对象离不开.它是一个内置对象——而不是其它对象的属性,允许用户执行各种使用日期和时间的过程. 一 Date 日期对象 ...
- JavaScript(八)日期对象
Date对象 1.创建方式 var now = new Date(); //现在返回的直接就是 当前的时间 不需要进行换算了 返回格式 (星期 月 日 年 时 分 秒 时区) 2.日期的格式化方 ...
- javaScript 计算两个日期的天数相差
一:计算两个日期相差的天数 1 <html> <head> <meta http-equiv="Content-Type" content=" ...
随机推荐
- 手把手写代码学习C语言基础
- PHP.30-TP框架商城应用实例-后台6-商品会员价格删除-外键,级联操作
商品会员价格删除 需求:当删除一件商品时,这件商品对应的会员价格也应该从会员价格表{price,level_id,goods_id}中删除掉. 有两种删除方法 1.在钩子函数_before_delet ...
- POJ 3580 SuperMemo 伸展树
题意: 维护一个序列,支持如下几种操作: ADD x y D:将区间\([x,y]\)的数加上\(D\) REVERSE x y:翻转区间\([x,y]\) REVOLVE x y T:将区间\([x ...
- 四大关键步骤掌握CloudOps模型
[TechTarget中国原创] 要让IT运维向云演进,企业必须拥抱自动化,并且改变资源预配的思考方式. 新涌现的术语CloudOps——云运维的简写,指代企业如何运行以及管理基于云的系统.并且,随着 ...
- 在sqlserver 中如何导出数据库表结构到excel表格中
先建空白excel--在数据库中的左侧找到该表, 选中需要导出的数据--Ctrl+C复制--打开记事本修改编码格式为Unicode-不自动换行保存--Ctrl+A--Ctrl+C,再打开excel-- ...
- 转:Redis设置认证密码 Redis使用认证密码登录 在Redis集群中使用认证密码
Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用.这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安 ...
- linux的screen常用命令使用记录
新建screen screen 或者 screen -S name - name用于指定一个screen的名字,默认系统随机 暂时退出当前screen ctrl + a + d - 同时按住这三个键即 ...
- hadoop-搭建(转)--亲测好用 (一)
1)JDK软件 下载地址:http://www.oracle.com/technetwork/java/javase/index.html 2)Hadoop软件 下载地址:http://hadoop. ...
- [洛谷P1792][国家集训队]种树
题目大意:给出由$n$个数组成的环,取某个数就可以得到它的分数,相邻的两个数不能同时取.问取$m$个数可以得到的最大分数. 题解:建一个大根堆,贪心取,每个点记录前驱后继,取一个点就把前驱后继设成不能 ...
- HDU 1007 Quoit Design | 平面分治
暂鸽 #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #d ...