默认情况下,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. Python 装饰器执行顺序迷思

    Table of Contents 1. 探究多个装饰器执行顺序 1.1. 疑问 1.2. 函数和函数调用的区别 1.3. 装饰器函数在被装饰函数定义好后立即执行 1.4. 疑问的解释 2. 参考资料 ...

  2. Android面试收集录1 Activity+Service

    1.Activity的生命周期 1.1.首先查看一下Activity生命周期经典图片. 在正常情况下,一个Activity从启动到结束会以如下顺序经历整个生命周期: onCreate()->on ...

  3. 通过Aspose.Word和ZXING生成复杂的WORD表格

    1.前言 这是我之前做的一个项目中要求的功能模块,它的需求是生成一个WORD文档,需要每页一个表格并且表格中需要插入文字.条形码和二维码等信息,页数可控制.具体的效果如下图所示: 可以看到有以下几点是 ...

  4. P2580 于是他错误的点名开始了(trie)

    P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉 ...

  5. MySQL之查询性能优化(一)

    为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段, ...

  6. PJMEDIA之录音器的使用(capture sound to avi file)

    为了熟悉pjmedia的相关函数以及使用方法,这里练习了官网上的一个录音器的例子. 核心函数: pj_status_t pjmedia_wav_writer_port_create ( pj_pool ...

  7. eclipse里导入maven项目有红叉的解决办法

    导入maven的项目上有红叉,说明eclipse里maven的插件该更新了 1.help里选择install new software 2.点击add,输入name:MavenArchiver, lo ...

  8. Escape From The Earth 逃离地球

    1.对Tags进行管理 设置一个全局的类,类似如下: public class Tags:MonoBehaviour{ public const string player="Player& ...

  9. Oz代码梳理

    https://files.cnblogs.com/files/gushiren/oz%E6%B5%81%E7%A8%8B%E5%9B%BE.pdf https://files.cnblogs.com ...

  10. 常见数据结构图文详解-C++版

    目录 简介 一.数组 1. 静态数组 array 2. 动态数组 2.1. vector 2.2. priority_queue 2.3. deque 2.4. stack 2.5. queue二.单 ...