Solr 17 - Solr的时间为什么比本地少8小时(附修改方法)

目录

  • 1 为什么少8小时
  • 2 如何查看Solr的时区
  • 3 修改Solr的时区
    • 3.1 Solr从数据库中同步数据的原理
    • 3.2 为什么要修改时区
    • 3.3 如何修改时区

1 为什么少8小时

(1) 原因:

Solr服务中默认使用的是UTC时间, 而中国本地时间为东八时区, 即比UTC标准时间多8小时.

(2) 示例:

① 中国内地服务器时间为2018-10-10 20:00:00, 系统将当前时间添加到Solr索引中时, Solr底层发现此时间的格式为UTC + 8, 它将对该时间减去8小时处理, 然后建立相关索引.
② 在查询上述添加的时间时, Solr直接将索引信息返回, 变为: 2018-10-10T12:00:00Z ==> 时间少了8小时.

(3) 不同的时间格式:

  • UT, Universal Time, 世界时: 是基于天体观察计算出来的时间, 是指英国格林尼治所在地的标准时间. 由于天体运行的一些不确定性(比如地球的自转并不是匀速的, 而且正在缓慢减速), 所以UT时间并不均匀.
  • UTC, Universal Time Coordinate: 协调世界时, 是基于原子时钟的时间, 是均匀的时间. 为了与UT时间保持较小的差距, UTC体系中增加了闰秒, 即某些年份的最后1分钟有61秒.
  • GMT, Greenwish Mean Time, 格林尼治标准时间: 是人们对UTC的另一种称法. 本初子午线被定义为英国伦敦郊区的皇家格林尼治天文台所在的经线, 此前人们将此地的时间当做标准时间, 但后来发现基于地球的时间并不准确, 在提出UTC概念后, 人们仍然自然地使用GMT来表达时间, 而此时的GMT == UTC.

2 如何查看Solr的时区

通过Solr Admin (Solr Web界面)查看:

(1) 进入Solr Admin, 点击左侧的Java Properties菜单, 进入Java属性设置页面;

(2) 下拉右侧的滚动条至底部, 可以看到时区属性, 如下图所示:

说明: 默认的时区为UTC, 上图是已经修改后的东八区(GMT+8).

3 修改Solr的时区

3.1 Solr从数据库中同步数据的原理

① 我们知道, Solr中的数据源有很多是类似于MySQL的关系型数据库, 也就是Solr通过其DIH(Data Import Handler)处理;

② Solr在更新数据时, 会记录这些数据的最后更新时间戳, 保存在Collection/conf目录下, 与db-data-config.xml文件同级, 文件内容类似于:

#Thu Jan 24 15:03:58 CST 2019
_delta.last_index_time=2019-01-08T05\:48\:21Z
_full.last_index_time=2019-01-24T07\:03\:37Z
last_index_time=2019-01-24T07\:03\:37Z

③ 在向MySQL、MongoDB等数据库中写入数据时, 添加类似于CreateTime的字段, 用于记录数据的入库时间戳;

④ 通过比较Solr和数据库的更新时间戳, 完成对数据是否需要增量同步的判断, 从而实现数据更新. 对比方式类似于:

<!-- MySQL中增量同步数据的配置类似于 -->
<entity name="BookShop_delta"
     query="SELECT ID, Name, CreateTime FROM BookShop
            WHERE CreateTime >= '${dataimporter.last_index_time}'" pk="ID">
<field column="ID" name="ID" />
<!-- ... -->
</entity>

<!-- MongoDB中增量导入数据的配置类似于 -->
<entity name="_delta" processor="MongoEntityProcessor"
          query="{'CreateTime': {'$gte': ISODate('${dih.last_index_time}')}}"
     collection="BookShop" project="{_id:0, ID:1, Name:1, CreateTime:1}"
     datasource="ShopMongo" transformer="MongoMapperTransformer" >
<field column="ID" name="ID" />
<!-- ... -->
</entity>

3.2 为什么要修改时区

由上述分析可知, 修改时区的原因主要是: 方便与数据库中数据的自动同步.

一般情况下, MySQL等数据库服务器的时区都与实际时区一致, 也就是东八区(GMT+8), 而Solr默认的时区是UTC, 与东八区(GMT+8)相差8个小时.

这种差距导致我们无法直接根据Solr的更新时间戳和MySQL等数据库的更新时间戳进行比较, 从而使得数据的导入出现问题.

==> 所以需要修改Solr的时区.

3.3 如何修改时区

Solr的时区属性所在配置文件, 在${SOLR_HOME}/bin下:

solr.in.sh是Linux系统下的启动脚本, solr.in.cmd是Windows系统下的启动脚本.

以Linux系统为例, 编辑solr.in.sh文件:

vim /data/solr-cloud/solr-4.10.4/bin/solr.in.sh

找到SOLR_TIMEZONE的相关配置: SOLR_TIMEZONE="UTC", 可以看出默认的时区是UTC, 而且被注释掉了. 可将其修改为:

SOLR_TIMEZONE="UTC+8"

保存退出后, 重启Solr服务, 然后再次进入Solr Admin管理界面, 查看Java Properties菜单, 即可发现时区已经修改成功.

参考资料

UT,UTC,GMT时间区别

Linux+Solr+Zookeeper-04:修改Solr的时区TIMEZONE

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

原文地址:https://www.cnblogs.com/shoufeng/p/10618571.html

时间: 2024-09-30 00:33:22

Solr 17 - Solr的时间为什么比本地少8小时(附修改方法)的相关文章

PHP date函数输出时间少8小时的解决方法

使用某些PHP服务器套件开发PHP程序的时候,调用date函数输出时间会少8小时,下面提供一个解决的方法. <?php date_default_timezone_set('PRC'); echo date("Y-m-d H:i:s",time()); ?>

logstash 默认时间少8小时的修改办法

logstash 的配置文件添加 filter { ruby { code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" } ruby { code => "event.set('@timestamp',event.get('timestamp'))" } mutate { remove_field => ["timestamp&

solr和java时区时间日期转化方法

我们一般得到的时间为当地时区的时间,而我存储到服务器上时想得到格林威治时间(GMT)和世界协调时间(UTC).一种是通过时间差计算:目标时区时间+时区差=本时区的时间.另一种则是通过设置时区不过要调用set方法,在多线程情况下调用set会发生错误,所以最好使用第一种: 第一种代码: package com; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public cla

windows 下tomact,jdk solr 搭建solr

工具: jdk8.0(solr6.1.0必须装jdk8.0,开始装的7.0最后卸了)下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html solr6.1.0 http://www.apache.org/dyn/closer.lua/lucene/solr/6.1.0 tomact (我下的8.5)http://tomcat.apache.org/ 步骤: 1.先安装jdk,保证在cmd

如何将一个格林威治字符串时间格式化转换为本地时间

python 时间函数学习了一大堆,那到底怎么将一个格林威治的时间字符串转换为本地时间呢? 这里将以一个格林威治时间字符串转换为北京时间为例进行说明. 格林威治时间字符串:2015-08-31T11:20:48 首先将这个字符串转换为表示时间的tuple格式: >>> t=time.strptime('2015-08-31T11:20:48','%Y-%m-%dT%H:%M:%S') >>> t time.struct_time(tm_year=2015, tm_mon

Solr入门-Solr服务安装(windows系统)

安装Solr 首先保证已经正确安装了Java 下载Solr,当前最新版6.1.0 Solr各个版本下载地址 Solr从6.0之后需要Java1.8所以如果使用Solr6.0及其以上版本,请确保Java版本在1.8之上 将Solr下载之后解压在电脑的某个目录,我解压到了D盘根目录下 启动Solr 启动Solr(windws版,以下都是windows下的) 进入solr的解压目录 cd bin solr.cmd start Solr启动成功! 管理控制台地址为 http://localhost:89

使用MBROSTool 工具制作本地硬盘F3救急模式的方法总结

前面写了一篇使用MBROSTool 工具制作本地硬盘多启动盘的方法总结.里面就是可以把一些系统安装到硬盘上面方便使用,比如安装PE到硬盘,不过启动的时候会先进入多UDm菜单,然后选择[启动本地系统]后才会进入本地的系统, 有的人不喜欢这种,或者只希望用PE,那么可以使用F3救急模式,也就是默认就没有变化,开机直接进入本地系统,只有按下F3的时候才进入PE系统,我之前也网上找过很多方法,不过都很麻烦,也很危险,曾经误操作导致分区表错误,丢失掉硬盘上的所有数据,下面就来用MBT实现这个功能. 首先F

linux下日期时间自动同步设置(rdate,ntpdate两种方法)

linux下同步时间,至少有两种方法:rdate,ntpdate两种.centos最小化安装默认不安装,先确认已经安装过,否则先安装.其中rdate本身是用来获取远程时间服务器上时间用的,带上 -s 参数,就可以将获取到的时间应用到本地系统. NAME       rdate - get the time via the networkSYNOPSIS       rdate [-p] [-s] [-u] [-l] [-t sec] [host...]DESCRIPTION       rdat

PHP获取时间比实际时间少8小时的问题

有两方法 1.我们写PHP程序在获取时间时,人为加上8小时(这种方法是最实用也是最土的方法) 2.如果直接获取正确时间,也可修改PHP的配置文件,即查找php.ini文件 修改方法:在php.ini文件中找到下面这行: ;date.timezone = 将上面这行的;注释符去掉,后面加上PRC(中国人民共和国的英文单词缩写),即改成下面这样: date.timezone = PRC 如果php.ini文件中没有上面这行,直接加上就行了 从php5.10开始,php中加入了时区的设置,在php中显