由于之前去mongo库里面根据一个时间字段查询一个时间段的数据,结果设置了相应的开始时间和结束时间,结果查询不到数据,惊呆了老铁,怎么搞?
根据初中地理知识我们知道由于地球是一个倾斜的球体,地球有公转和自转 自西向东 ,公转自西向东是一个椭圆,公转一周为一年,自转一周为一天,我们生活在地球上的人们从古到今天各个地区各个国家和地域的人都会发明一些他们自己的时间计量方法,到了现代科技不断进步,世界的人们不在是孤立不通的小群体而是变成了一个互联互通的地球村,从而就让时间计量也统一起来了,地球分为东半球和西半球,太阳东升西落,本初子午线的位置是最早看到日出的,将地球的360度的经度划分为24分,就形成了24个时区,所以一个时区15度, 东1区至东12区,西1区至西12区,其中东西12区跨度都是7.5°也叫半时区 。
首先我们需要知道几个时间概念:GMT(格林威治时间)、UTC(世界标准时、世界统一时间、国际协调时间)、CST、Unix时间戳、ISO、夏令时、网络时间协议
格林威治位于泰晤士河南岸,与北岸城镇通隧道和公路。1423年格洛斯特公爵亨天雷围建了格林尼治公园,在河畔山丘建了镃望塔,后又建造了格林威治皇家天文台。格林尼治天文台负责每隔一小时向全世界发放调时信息,由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林威治平时基于天文观测本身的缺陷,已经被原子钟报时的世界协调时间(UTC)所取代 , 也叫世界时(Universal Time),也叫世界标准时间。是指位于英国伦敦郊区的【皇家格林尼治天文台】的标准时间,是本初子午线上的地方时,是0时区的区时。
又称世界统一时间、世界标准时间、国际协调时间、世界协调时间,UTC协调世界时即格林威治平太阳时间,是指格林威治所在地的标准时间,也是表示地球自转速率的一种形式,UTC基于国际原子时间,通过不规则的加入闰秒来抵消地球自转变慢的影响,是世界上调节时钟和时间的主要时间标准 (维基百科)(世界时间在线), Coordinated Universal Time直译为:世界协调时间。它是以原子时作为计量单位的时间,计算结果极其严谨和精密。它比GMT时间更来得精准,误差值必须保持在0.9秒以内,倘若大于0.9秒就会通过闰秒来“解决”,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统 , 中国大陆采用ISO 8601-1988的《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408-1994)称之为国际协调时间,代替原来的GB/T 7408-1994;中国台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》,称之为世界统一时间
原子时:物质的原子内部发射的电磁振荡频率为基准的时间计量系统。美国的物理实验市在2014年造出了人类历史上最精确的原子钟,50亿年误差1s,可谓相当靠谱了。中国的铯原子钟也能确保2000万年误差不超过1s。
大事记:1979年12月初内瓦举行的世界无线电行政大会通过决议,确定用“世界协调时间(UTC时间)”取代“格林威治时间(GMT时间)”,作为无线电通信领域内的国际标准时间
1967年人类制作出原子钟,从而“发明”了UTC时间正式投入使用。它是真正意义上的标准时间,以原子钟所定义的秒长为基础,UTC时间认为一个太阳日(一天)总是恒定的86400秒(24小时)
UTC是协调时间,含义为:一切以我为基准,全部想我看齐。所以称它为世界标准时间是没毛病的,而把GMT称作格林威治当地时间更为合适(也叫旧的标准时间)
CST这个缩写比较尴尬的是它可以同时代表四个不同的时间:
CST可视为美国、澳大利亚、古巴或中国的标准时间。
CST可以为如下4个不同的时区的缩写:
美国中部时间:Central Standard Time (USA) UT-6:00
澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
中国标准时间:China Standard Time UT+8:00
古巴标准时间:Cuba Standard Time UT-4:00
中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8
时间戳一般指的UNIX时间,或类UNIX系统(比如Linux、MacOS等)使用的时间表示方式。定义为:从UTC时间的起到现在的总秒数(秒是毫秒、微妙、纳秒的总称) 它就是:格林威治时间(GMT)1970年1月1日的午夜0点0分0秒
是一种时间的表示方法 ,在时间日期上它全称是ISO 8601,是一种日期/时间表示方法的规范。规定了一种明确的、国际上都能理解的日历和时钟格式
这一ISO标准有助于消除各种日-日惯例、文化和时区对全球业务产生的影响。它提供了一种显示日期和时间的方式,这种方式是明确定义的,对人和机器都是可以理解的。当日期用数字表示时,它们可以以不同的方式进行解释。例如,01/05/12可以表示2012年1月5日或2012年5月1日。在个人层面上,这种不确定性可能非常令人沮丧,在商业环境中,它可能非常昂贵。在日期不明确的情况下,组织会议和交付、书写合同和购买机票都是非常困难的。
ISO 8601通过制定一种国际公认的日期表示方式来解决这种不确定性:。例如 September 27, 2012就会被表示为2012-09-27。
很多开发语言内置了一些常用的ISO标准日期/时间格式,如Java中的: - ISO.DATE:yyyy-MM-dd, e.g. “2000-10-31” - ISO.TIME:HH:mm:ss.SSSXXX, e.g. “01:30:00.000-05:00” - ISO.DATE_TIME:yyyy-MM-dd’T’HH:mm:ss.SSSXXX, e.g. “2000-10-31T01:30:00.000-05:00”.
DST(Daylight Saving Time),夏令时又称夏季时间(可没有冬令时哦)。它是为节约能源而人为规定地方时间的制度(鼓励人们早睡早起,不要浪费电,夏天日照时间长尽量多用自然资源),全球约40%的国家在夏季使用夏令时,其他国家则全年只使用标准时间。正在使用夏令时的代表国家:美国、欧盟、俄罗斯等等
每年的夏令时时间段还不一样(一般在3月的第2个周日开始),比如美国2020年夏令时时间是:2020年3月8日 - 2020年11月1日。具体做法是:在3.8号这天将时钟往前拨拨1个小时,11.1号这天还原回来。
中国在1986 - 1992年短暂搞过一段时间,但太麻烦就“废弃”了
大事记:目前全世界有近110个国家每年要实行夏令时。 自2011年3月27日开始俄罗斯永久使用夏令时,把时间拨快一小时,不再调回
夏 令时是地方的时间制度(并非全球标准),施行夏令时的地方,每年有2天很特殊,即一天只有23个小时,另一天则有25个小时。
由于闰秒的存在,那么当闰秒发生时,就极有可能出现同一个时间戳表示两个时刻的情况(类似时钟回拨),而且闰秒还没规律所以无法程序式的避免,怎么破?这个时候就需要一种专门的对时协议来保证了,它就是:网络时间协议
网络时间协议 Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。
NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务,各大操作系统(windows/Linux)对NTP都有实现
我们可以认为格林威治时间就是世界协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。
世界标准时间 (UTC, Coordinated Universal Time) 是当今民用时间的基础。它使用一天 24 小时时间制,并结合了地球的自转时间与原子钟的高精度度量。
UTC是一个标准,而不是一个时区。UTC 是一个全球通用的时间标准。全球各地都同意将各自的时间进行同步协调 (coordinated),这也是 UTC 名字的来源:Universal Coordinated Time。
UTC + 时区差 = 本地时间
时区差东为正,西为负。在此,把东八区时区差记为 +0800,
UTC + (+0800) = 本地(北京)时间 (1)
那么,UTC = 本地时间(北京时间))- 0800 (2)
在计算机中看到的UTC时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳。
mongo默认使用的是UTC时间,所以不管在命令行进行字段时间范围的查询还是有写代码设计字段的时间范围查询都会遇到这个问题,就需要把开始和结束的时间减去8个小时再去查询就可以查询到数据了,查询sql如下:
如果是用代码查询的话需要转化下时间,一般来说时间字段入库的时候就采用UTC时间格式,查询的时候注意UTC时间和本地时间的一个转化就可以了,具体的转化网上都有响应的教程的,UTC和本地时间中间有时差所以需要转化时区计算处理,如果使用的是spring-boot-starter-data-mongodb的MongoTemplate来处理时间相关的字段方式如下:
插入数据MongoTemplate帮我们把时间字段转化为UTC时间,查询出数据需要在实体字段上加入注解:
Date类型
LocalDateTime类型
加上8小时,那查询的时候也要加8小时,就很麻烦,所以不处理,查询实体上加注解即可。
大多数的中间件产品,像Mongo、ES等基本都是使用这个UTC时间,因为它是标准的,就是会跟本地时间存在时差,这个是一个很坑的地方,mongo如果数据上亿来一个这种时间范围查询根本查询不动的,在命令行中执行一个时间范围的查询基本查不出来,估计要等Long Long Ago,,所以就很鸡肋,能使用ES的就不使用Mongo,ES的时间处理,索引的setting中字段声明如下:
这个栗子是定义索引的mapping的时间字段定义,es的索引定义也有好几种方式的,就不做过多讲解。
以上就是本篇文章【mongo命令行时间字段范围查询的坑】的全部内容了,欢迎阅览 ! 文章地址:http://sicmodule.glev.cn/news/9073.html 资讯 企业新闻 行情 企业黄页 同类资讯 首页 网站地图 返回首页 歌乐夫资讯移动站 http://sicmodule.glev.cn/mobile/ , 查看更多