默认情况下,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的日期时区问题的更多相关文章

  1. javascript+php实现根据用户时区显示当地时间的方法

    本文实例讲述了javascript+php实现根据用户时区显示当地时间的方法.分享给大家供大家参考.具体如下: 在跨时区应用中会用到下面代码,这是以前写的一段代码. 服务器保存相关时间配置,保存形式为 ...

  2. JavaScript 中如何将日期格式化为 DD/MM/YYYY

    在 JavaScript 中要将日期格式化为 dd/mm/yyyy .需要遵循以下步骤: 使用 getDate().getMonth() 和 getFullYear() 方法获取特定日期的日.月和年. ...

  3. MongoDb查询日期范围

    {"AdID":"2", "CrateDate":{"$gte":ISODate("2014-10-12T16 ...

  4. mongodb按照日期分组统计

    目录 1.使用时间格式化方法 2.进行时间补偿(默认当前时区是东八区,即8x3600x1000=28800000) mongodb的默认时间是格林尼治时间,如果是要按照日期进行分组需要注意!!!. 解 ...

  5. Javascript Date 判断输入日期是否正确

    JavaScript的Date对象有容错性,可将随意给定的日期的年月日自动生成正确的日期时间 //JavaScript中Date对象容错性 function dateCheck(){ var date ...

  6. javascript 计算两个日期的差值

    代码 Typescript版 /** * TimeSpan just like the class TimpSpan in C# ,represent the time difference * @c ...

  7. JavaScript初探系列之日期对象

    时间对象是一个我们经常要用到的对象,无论是做时间输出.时间判断等操作时都与这个对象离不开.它是一个内置对象——而不是其它对象的属性,允许用户执行各种使用日期和时间的过程. 一   Date 日期对象 ...

  8. JavaScript(八)日期对象

    Date对象 1.创建方式 var now = new Date(); //现在返回的直接就是 当前的时间 不需要进行换算了   返回格式  (星期 月 日 年 时 分 秒 时区) 2.日期的格式化方 ...

  9. javaScript 计算两个日期的天数相差

    一:计算两个日期相差的天数 1 <html> <head> <meta http-equiv="Content-Type" content=" ...

随机推荐

  1. 基于HDP版本的YDB安装部署(转)

    第三章 YDB依赖环境准备 一.硬件环境 硬件如何搭配,能做到比较高的性价比,不存在短板.合理的硬件搭配,对系统的稳定性也很关键. 1.CPU不是核数越高越好,性价比才是关键. 经常遇到很多的企业级客 ...

  2. Azure Cloud Service - PaaS

    使用Azure Cloud Service有一段时间了,前阵子在公司内部做一个Cloud Service培训的时候就在想,能不能用一幅图把Cloud Service所涉及的概念都罗列出来.于是就有了下 ...

  3. 11,nginx入门与实战

      网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web 网络服务是一种被动 ...

  4. c语言的左移、右移

    先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2;  //把i里的值左移2位 也就是说,1的2进制是0 ...

  5. CentOS 7.X 搭建时间服务器 --- chrony

    之前centos6我们一直用的ntp时间服务器,虽然到CentOS7上也可以装ntp.但是各种坑啊.这次换一个时间同步工具---->chrony ======================== ...

  6. Robocopy.exe使用详例

    Robocopy.exe使用详例           Robocopy.exe 是 微软在Windows server 2003 Resource Kit Tools 里面提供的程序来做备份的.Vis ...

  7. C# Json 序列化大全--任我行

    public class JsonHelper { /// <summary> /// 将Model转换为Json字符串 /// </summary> /// <type ...

  8. Pascal小游戏 文件的产生

    一个整人的Pascal小程序 运行之后硬盘里面会有一大堆垃圾,当然更好的方法当然不是这样做! var a,b,c,d:char;beginfor a:='0' to '9' dofor b:='0' ...

  9. Windows下安装jenkins,关闭jenkins,修改jenkins端口号

    1.Jenkins安装部署 在官网下载Jenkins: https://jenkins.io/download/thank-you-downloading-windows-installer-stab ...

  10. ffifdyop

    题目地址:http://www.shiyanbar.com/ctf/2036 后台登陆 上来看到这个界面,果断先看一波源代码. 看到是拼接字符串进行sql查询,就想到了注入了. 但是很不幸的是md5( ...