在MongoVUE中发现插入的时间和实际的时间相差8小时?

在Mongodb使用过程中,发现一个问题,就是我们插入Date类型时会发现保存到mongodb中的数据却晚了8个小时,这是为什么呢?我想大家在使用客户端工具如MongoVUE时,也会发现查询出来的数据也是晚了8个小时的?下面简单描述下原因。

上面的两个问题,我们依次来看是为什么?

(1)在Java编码过程中,使用mongodb的java驱动包保存数据时,数据库里的数据比实际时间少了8个小时,为什么?

为了找打原因,我下载了个mongodb的java驱动包,想通过驱动包来找到原因,驱动包如下:

我们都知道,mongodb数据库是基于文档的,每个文档都是一个类json格式的,那么肯定在保存到数据库时进行了某种json序列化操作,我们朝着这个方向去找到相关的序列化类,我们在com.mongodb.util包下看到一个JSON类,在这个类里有如下逻辑进行序列化:

public static String serialize(Object object)
  {
    StringBuilder buf = new StringBuilder();
    serialize(object, buf);
    return buf.toString();
  }

  public static void serialize(Object object, StringBuilder buf)
  {
    JSONSerializers.getLegacy().serialize(object, buf);
  }

可见,对于任何类型是先找到相对应的序列化类(有点像hessian、fastjson的实现),然后调用对应的序列化类对对象Object进行序列化操作。

我们在JSONSerializers这个类内部看到这么一段:

serializer.addObjectSerializer(Date.class, new LegacyDateSerializer(serializer));

这句用于将java.util.Date类型与LegacyDateSerializer序列化类进行了绑定,使用该类对java.utl.Date类型进行序列化,我们看看是怎么序列化的:

private static class LegacyDateSerializer extends JSONSerializers.CompoundObjectSerializer
  {
    LegacyDateSerializer(ObjectSerializer serializer)
    {
      super();
    }

    public void serialize(Object obj, StringBuilder buf)
    {
      Date d = (Date)obj;
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
      format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
      this.serializer.serialize(new BasicDBObject("$date", format.format(d)), buf);
    }
  }

从代码可以看出来,其实对于我们的Date类型都是转换为国际标准时间GMT的,而我们的时区是东八区(GMT+8),因此经过转换为时间少了8个小时,在数据库中看到的也就少了8个小时。

现在我们知道了原因,那么这种情况影不影响我们的业务呢?没有影响的,因为在我们读取的时候mongodb的java驱动同样为我们做了相应的转换工作。

(2)使用MongoVue客户端软件操作mongodb数据库时看到的数据和实际保存时间相差8个小时为什么?

其实,通过上面的描述我们其实很容易理解看到的数据为什么少了8个小时,但是怎样才能看到我们实际的时间呢?

在Tools下面有个Preferences;

选择Views,可以看到我们这时候选择的是UTC;

这时候我们需要选择成上面的,使用本地时区进行显示:

这时候我们就可以在这个客户端工具中看到时间我们插入的时间是一致的了。Do you get it? ^_^

备注:尊重原创,如需转载请标明出处,谢谢。

时间: 2024-08-06 12:35:56

在MongoVUE中发现插入的时间和实际的时间相差8小时?的相关文章

Hive通过查询语句向表中插入数据过程中发现的坑

前言 最近在学习使用Hive(版本0.13.1)的过程中,发现了一些坑,它们或许是Hive提倡的比关系数据库更加自由的体现(同时引来一些问题),或许是一些bug.总而言之,这些都需要使用Hive的开发人员额外注意.本文旨在列举我发现的2个通过查询语句向表中插入数据过程中的问题,希望大家注意. 数据准备 为了验证接下来出现的问题,需要先准备两张表employees和staged_employees,并准备好测试数据.首先使用以下语句创建表employees: create table employ

向mysql中批量插入数据的性能分析

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

SQL Server 2012中快速插入批量数据的示例及疑惑

SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以供有兴趣的同学参考. 附:我的测试环境为:SQL Server 2012,命名实例 Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) Feb 10 2012 19:13:17 Copyright (c) Microsoft Corporatio

PeopleRank从社交网络中发现个体价值

阅读导读: 1.什么是PeopleRank? 2.PeopleRank和PageRank有什么区别? 3.PR分析微博数据时,如何对微博单个账号评分? 4.R语言如何递归计算矩阵特征值? 5.如何计算粉丝的关注度? 1. PeopleRank和PageRank PageRank让Google成为搜索领域的No.1,也是当今最有影响力的互联网公司之一,用技术创新改变人们的生活.PageRank主要用于网页评分计算,把互联网上的所有网页都进行打分,给网页价值的体现. 自2012以来,中国开始进入社交

Oracle中如何插入特殊字符: & 和 ' (多种解决方案)

分类: Oracle Oracle中如何插入特殊字符:& 和 ' (多种解决方案) 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Insert语句,怎么会有自定义变量呢?后来搜索了一下关键字AMP发现,原来是因为在插入数据中有一个字段的内容如下: http://mobile.three.com.hk/3DX?uid=0676&sid=rt_060908 Oracle把这里的URL的参数连接符&当成是一个自

MySQL中如何插入反斜杠,反斜杠被吃掉,反斜杠转义(转)

MySQL中如何插入反斜杠,反斜杠被吃掉,反斜杠转义 问题描述:mysql中带有反斜杠的内容入库后,发现反斜杠无故失踪了(俗话说被吃掉了) 例:插入insert into tb('url') values('absc\eeee'); 结果数据库里的内容是:absceeee(反斜杠没了呢) 这么详细了相信大家都搞清楚问题了吧,下面看解决方案. 解决方案:用addslashes(),mysql_escape_string()等函数进行处理,也就是在插入数据库前,把内容处理一下  如:$cc = ad

Oracle中如何插入特殊字符:& 和 ' (多种解决方案)

Oracle把这里的URL的参数连接符&当成是一个自定义变量了,所以要求我给变量AMP赋值.怎么办呢?方法有三: ·方法一:在要插入的SQL语句前加上Set define off;与原SQL语句一起批量执行   我们在SQL*PLUS下执行 SQL> show all命令时,可以发现一个参数:define "&" (hex 26),如下图所示   ......   concat "." (hex 2e)   copycommit 0   cop

站立会议中发现的一些新问题

最近在执行站立会议中发现了一些新问题: 有些人希望记录下来,然后照着念 严重现象,记录往往会产生大量冗余文字,念的时间较长,会浪费其他人时间. 有人说,不念,会有忘记遗漏. 其实没关系,忘记遗漏一般说明这个事情不重要.时间长了,应该会把自己刚做完的,和要做的事情记得很清楚,因为本来也不会很多. 如果在说的时候产生了遗忘,项目经理会在验证的时候针对差异进行询问,会将这个问题修复掉的. 声音不够大 仍然存在着有些人声音偏小,其他人听不清的现象. 程序员需要锻炼表达能力,表达一遍也是一个反思的过程,可

Word2007中如何插入参考文献

很多国内的期刊杂志都只能使用word模板,导致插入参考文献成了件麻烦事,这时特别怀念Latex的便捷.于是找到一篇介绍word2007里插入参考文献的好方法,就是利用尾注的方法使文章的参考文献标号可以随插入位置变化而自动调整,这使我对word模板稍有安慰. 原文转自: http://blog.sina.com.cn/s/blog_4abcabeb01014pjh.html 非常感谢!O(∩_∩)O 使用尾注: 1.光标移到要插入参考文献的地方,菜单中引用——脚注(大框框)——右下角的箭头——设置