最新要闻
- 最高可抵6000元!苹果宣布Mac Studio等设备加入换购计划
- 今日讯!大厂中第一个对标ChatGPT 百度文心一言2个月来性能已提高50倍
- 拼了!35岁男子为考清华复读14年:没浪费教育资源 奖金仅够生活-天天快播
- 淄博夜空500架无人机助力高考:为学子加油 当前速递
- 聚焦:“牧马人同款大皮卡”全新Jeep角斗士谍照曝光
- 科林电气:中标3个国家电网采购项目,中标总金额约9475万元_新动态
- 智慧医疗让看病更便捷-新资讯
- 马斯克扔下车圈核弹:特斯拉FSD可以给其他车企用!-每日热点
- 小米又一爆款诞生!小米手环8国内出货破110万:上市不到俩月 全球短讯
- 价值或达500亿 国铁大规模采购动车组:350公里时速复兴号就有103组
- 疑似比亚迪F品牌官方账号成立:名为“方程豹汽车”
- 奇瑞杀疯了!5月销量近14万辆 一路反超吉利、长城
- 世界热讯:电解槽和氢能矿卡上榜内蒙古2023年技术装备首台(套)名单
- 小学生发现深沟露出车轮救人一命被网友点赞心细:老人驾老头乐失控导致
- 天天热点评!全球第一套!龙芯2K1500控制器不间断运行142天3408小时
- 喝酒去世网红家墙壁写着钱比命重要 网友唏嘘!家人:从没割过粉丝韭菜
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
java springboot整合elasticsearch时关于LocalDateTime处理的方式
环境:
springboot version:2.7.2
spring-data-elasticsearch: 2.7.2
(相关资料图)
elaseicsearch:7.10.1
以上是我测试环境,如果环境相差太大,可能会有所差异,仅做参考。
写博客主要是为了记录今天对LocalDateTime处理的过程。
首先,简单介绍一下业务环境。我们的业务库有大量数据,需要导到Elasticsearch中,以使用Elasticsearch的全文索。但有个问题,就是在业务库的时间,是2023-06-06 12:32:37.224这种模式的,并且,业务库的实体时间属性使用的都是LocalDateTime,如果直接录入到ES中,会发现,时间多了8小时。其实原因我也知道,所以这里不探究原因,只做处理。
我在这个过程中,曾进入一个误区,就是我就是要录入“2023-06-06 12:32:37.224”这个时间,然后我在ES中我还要显示“2023-06-06 12:32:37.224”这个时间,我不否认可能有这样的解决方案,但我想说的时间,没必要去纠结这个问题,因为在ES,是可以直接识别标准格式的时间,只要把时间的格式设置好了,在哪都是能识别的,时间显示永远不是问题,只要在kibana设置好了时区,前端自然会根据你选择的时区对时间进行转换显示。反而想让“2023-06-06 12:32:37.224”这样原始时间录入ES后仍然显示为“2023-06-06 12:32:37.224”会导致问题的复杂化。
在做处理之前,先简单了解下LocalDateTime,如下图,可以看到,LocalDateTime相当简单,关于LocalDateTime的知识,大家可以参考LocalDateTime - 廖雪峰的官方网站 (liaoxuefeng.com),因为LocalDateTime无时区的概念,如果仅是“2023-06-06 12:32:37.224”会被默认为0时区的时间录进去,而中国是东八区,比0时区早8小时。这样,自然就产生了时间差,多了了8小时。
那??直接把时间减去8小时,再录进去,不就行了吗?这样也对,比较暴力。当然,处理方法不只一种,我只说我的方式。
再次,我们来看ES里的时间,最后录入的时间,和原来的时间相比,多了个T和Z。
{"fields": { "@timestamp": [ "2023-06-06T04:32:37.224Z" ], "ywblStartTime": [ "2023-06-06T04:32:37.224Z" ], "ywblEndTime": [ "2023-06-06T04:32:37.224Z" ] }}
要想处理时间,得先了解这个T和Z是什么意思。T可以忽略,就是个分隔符,看成空格即可。关键在于Z这个,Z表示的是UTC,即国际标准时间,可以理解为0时区的时间。回到上面,如果我们在Mysql中的数据库的时间是2023-06-06 12:32:37.224,那对应的国际时间就是2023-06-06T04:32:37.224Z。明显发现,标准时间表示中,是少8小时的。这也是我这次的目标时间。
因此,要做的处理就有两个,一个是时间录入到ES时,需要从LocalDateTime转换成国际标准时间,查询ES时,需要把ES的时间转回LocalDateTime。
通过查看包org.springframework.data.elasticsearch.annotations,看到一个切面类ValueConverter,需要一个PropertyValueConverter参数,如下,没跑了,就是你了!
@Retention(RetentionPolicy.RUNTIME)@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })@Documented@Inheritedpublic @interface ValueConverter { /** * Defines the class implementing the {@link PropertyValueConverter} interface. If this is a normal class, it must * provide a default constructor with no arguments. If this is an enum and thus implementing a singleton by enum it * must only have one enum value. * * @return the class to use for conversion */ Class extends PropertyValueConverter> value();}
下面是接口类PropertyValueConverter,其实也相当简单,只要实现这两个方法即可。英文可以看看,其中write是从实体到ES的转换,这里要返回的是String,read则是从ES于实体的转换,返回的是LocalDateTime
public interface PropertyValueConverter { /** * Converts a property value to an elasticsearch value. If the converter cannot convert the value, it must return a * String representation. * * @param value the value to convert, must not be {@literal null} * @return The elasticsearch property value, must not be {@literal null} */ Object write(Object value); /** * Converts an elasticsearch property value to a property value. * * @param value the elasticsearch property value to convert, must not be {@literal null} * @return The converted value, must not be {@literal null} */ Object read(Object value);}
下面直接上代码吧:
/** * 关于类的说明 * * @Author lythen * @date 2023/6/6 11:34 **/@Slf4jpublic class LocaDateTimeEsConverter implements PropertyValueConverter { /** * Converts a property value to an elasticsearch value. If the converter cannot convert the value, it must return a * String representation. * * @param value the value to convert, must not be {@literal null} * @return The elasticsearch property value, must not be {@literal null} */ @Override public Object write(Object value) { if(value instanceof LocalDateTime ) {LocalDateTime localDateTime = (LocalDateTime)value; ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,ZoneId.of("GMT+8")); return zonedDateTime.toInstant().toString();
} return value; } /** * Converts an elasticsearch property value to a property value. * * @param value the elasticsearch property value to convert, must not be {@literal null} * @return The converted value, must not be {@literal null} */ @Override public Object read(Object value) { try { String strDateTime = value.toString(); Instant instant = null; if(value.getClass().getName().contains("Long")){ long longTime = (Long) value; Date date = new Date(longTime); instant =date.toInstant(); } else{ instant = Instant.parse(strDateTime); } LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,ZoneId.of("GMT+8")); return localDateTime; }catch (Exception e){ log.error(e.getMessage(),e); return null; } }}
转换的思路如下:
实体->ES,使用带区的时间类ZonedDateTime将原始时间识别为东八区时间(这里是识别,而非转换),以下为调试时的属性。这里的时间要和之前带Z的时间区分一下,这里能看到时间是“2023-06-06T14:56:50.880339300+08:00[GMT+08:00]”,这里表示这个是东八区的时间,而不是国际标准时间。最后zonedDateTime.toInstant(),这里其实是个取巧的方式,因为Instant自身也无时区概念,参考Instant - 廖雪峰的官方网站 (liaoxuefeng.com),它指的是时间戳,或者就理解为0时间区的时间也没什么问题,那使用zonedDateTime.toInstant()就是把东八区的时间转成了0时间区时间,再用个toString(),就转换成了UTC的国际标准时间,也就是少了8小时带Z的那个时间格式。
ES->实体
这个就没什么好说了,其实比较好理解,主要就是遇到了存储为Long的时间,因此多做了一个判断,后面也就是从UTC国际标准时间,转换为LocalDateTime的过程,转换之后,加了8小时,那我们查询的结果就正确了。
最后,在实体加上注解:
@Field(type = FieldType.Date, format = {DateFormat.date_hour_minute_second_millis}) @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @ValueConverter(LocaDateTimeEsConverter.class) LocalDateTime ywblStartTime; @Field(type = FieldType.Date, format = {DateFormat.date_hour_minute_second_millis}) @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @ValueConverter(LocaDateTimeEsConverter.class) LocalDateTime ywblEndTime;
关键词:
-
java springboot整合elasticsearch时关于LocalDateTime处理的方式
环境:springbootversion:2 7 2spring-data-elasticsearch:2 7 2elasei
来源: java springboot整合elasticsearch时关于LocalDateTime处理的方式
昇腾实战丨DVPP媒体数据处理图片解码问题案例
每日头条!实际薪资水平低迷引发前景担忧 日债收益率周二普遍回落
【新华500】新华500指数(989001)6日跌1%
最高可抵6000元!苹果宣布Mac Studio等设备加入换购计划
今日讯!大厂中第一个对标ChatGPT 百度文心一言2个月来性能已提高50倍
拼了!35岁男子为考清华复读14年:没浪费教育资源 奖金仅够生活-天天快播
淄博夜空500架无人机助力高考:为学子加油 当前速递
聚焦:“牧马人同款大皮卡”全新Jeep角斗士谍照曝光
科林电气:中标3个国家电网采购项目,中标总金额约9475万元_新动态
环球观天下!在 Windows 系统上,你可以使用 Certbot 生成 Let's Encrypt 的泛域名证书。以下是具体步骤
焦点速看:如何让你的结构体更高效
【专为苛刻的数据环境而构建】上海道宁为您带来世界上先进的矢量原生、时间序列和实时分析数据库——kdb系列产品|世界新消息
天天快消息!提升生产线效率与质量:智慧工厂的优势与应用
Java-模板生成PDF方式2-PDFBox
智慧医疗让看病更便捷-新资讯
马斯克扔下车圈核弹:特斯拉FSD可以给其他车企用!-每日热点
小米又一爆款诞生!小米手环8国内出货破110万:上市不到俩月 全球短讯
价值或达500亿 国铁大规模采购动车组:350公里时速复兴号就有103组
疑似比亚迪F品牌官方账号成立:名为“方程豹汽车”
奇瑞杀疯了!5月销量近14万辆 一路反超吉利、长城
世界热讯:电解槽和氢能矿卡上榜内蒙古2023年技术装备首台(套)名单
Web安全-渗透测试-基础知识03
小学生发现深沟露出车轮救人一命被网友点赞心细:老人驾老头乐失控导致
天天热点评!全球第一套!龙芯2K1500控制器不间断运行142天3408小时
喝酒去世网红家墙壁写着钱比命重要 网友唏嘘!家人:从没割过粉丝韭菜
“宇宙猜想”CTO叶云出席元宇宙论坛并发表演讲
新品未能提振股价,苹果概念股跌幅扩大,华兴源创、长盈精密跌超15% 环球快讯
饶派杯 XCTF 车联网挑战赛 mqttsvr 复现|当前观点
【天天速看料】一条视频带你回忆高三这一年 网友感动:祝愿每位考生忙而不茫
《暗黑破坏神4》正式发售:标准版终于能玩了
苹果Vision Pro头戴支持近视用户:需额外掏钱买插片-世界观焦点
牛骨头汤有营养吗 牛骨头汤是否有营养
读改变未来的九大算法笔记05_数字签名
Git hooks与自动化部署-全球新消息
每日聚焦:直播平台源码画面质量功能的实现
云图说|ModelArts开发环境,让AI开发、探索、教学更简单 世界新要闻
苹果XR头显Vision Pro王炸登场:3499美元起售,2024年开卖-环球观天下
经常挖鼻孔会影响颜值 严重可诱发颅内感染
天天观热点:小米王腾分享苹果Vision Pro看法:令人赞叹、但普及需要时间
QQ空间18周岁 第一代美女网红鼻祖露面:16年没变样
压力给到合资品牌 上汽大众永久关停第一工厂:部分产线搬迁|全球要闻
全国爱眼日,王贾桥小学倡导学子保护视力、珍爱光明
linux tar解压命令总结
速讯:848中国鱼类资料图谱大全ACCESS\EXCEL数据库
顶象无感验证码助力京客隆提升数字化运营能力
MySQL用户与权限管理_每日热门
全球快播:电池级碳酸锂价格重回30万元/吨 锂盐厂商二季度业绩可期
抄底!百度网盘超级会员年卡178元:送优酷+喜马拉雅 世界实时
防止别人蹭热点 苹果Vision Pro完全不提元宇宙三个字
16.99万起!零重力座椅、无框车门、三种动力选择 长安深蓝S7即将上市
制作成本16.5亿!《封神三部曲》第一部定档:7月20日上映 焦点速读
天天消息!孙俪代言!超能双离子洗衣粉骨折价大促:39.9元11斤
国内卫浴二线品牌有哪些_国内卫浴二线品牌-最新
低利率环境与发行优势助推 商业银行绿色金融债发行火热
抽检合格率97.26%!江西加强中高考期间校园食品安全监管
阿根廷中国行 花30万可让梅西敬酒、合影?官方回应
续航2小时、仅售2万5!苹果首款AR眼镜开卖:还有半年时间攒钱
天天观天下!《暗黑4》德鲁伊玩家发声:不要随便攻击熊熊!
移动SSD也白菜价了!梵想PS2000 1TB只要279元 不到小米一半
天天日报丨天猫京东红包加码!最高23888元 每天最多领3次
阿根廷中国行 花30万可让梅西敬酒、合影?官方回应
在 Linux 中使用 sFTP 上传或下载文件与文件夹
日本工人的实际工资在4月份继续下降,尽管已经反映了在年度薪资谈判中所取得的加薪,这给考虑召集选举的首相岸田文雄带来挑战|天天时讯
环球速递!76核核显GPU足以毁天灭地 苹果Mac Pro不支持任何独显
今亮点!AMD确认锐龙8000明年问世:Zen5 CPU、亮机核显大升级
iPhone不用再说“嘿 Siri”了!可能不好用:用户担忧误唤醒_每日快讯
烤串巨无霸!广西烧烤竹签长1米8:网友直呼开眼 一串吃饱|热点评
精彩看点:李宁获摩根大通增持1117.05万股 最新持股比例为5.07%
全国中成药集采分组等多项信息公布 96家药企参与申报 多个品种竞争激烈
国际金融市场早知道:6月6日
取代iPhone?苹果发布首款MR头显Vision Pro:卖到2.5万天价
资讯:实用性看齐安卓?这就是iOS/iPad OS 17 苹果已推送测试版:iPhone 8、X被弃
天天简讯:《小美人鱼》全球票房突破3亿美元 黑美人鱼欢呼:大家还是爱看我的
独立在轨33天 状态良好:天舟五号与空间站组合体再次对接 时讯
7月14日上映!《碟中谍7》发布新剧照:59岁阿汤哥骑摩托冲下悬崖 头条焦点
龙岗生态司法修复基地揭牌 天天动态
24800元的苹果Vision Pro发布 一文看懂WWDC23有多硬!
母亲病危家人让高考孩子见最后一面 网友争议:高考高于亲情?|天天微速讯
天弘中证沪港深线上消费主题交易型开放式指数证券投资基金基金产品资料概要(更新)
环球热点!SD协议-时序
JAVA学习笔记_基础篇01
基于 log4j2 插件实现统一日志脱敏,性能远超正则替换-焦点信息
焦点观察:MRST绘制三维网格图
每日焦点!生态河湖 诗画江城
2.4万元!苹果首款MR头显Vision Pro发布:单眼像素超越4K电视
真颠覆XR!苹果Vision Pro技术、体验几乎完美 但是一根线毁所有|世界快报
苹果Mac三大新品国行价格汇总:巅峰顶配9.7万元-环球速看
8450米的珠峰上舍命救人 女子承诺1万美元只肯给4000美元:贵吗?
1100万年后 决定性别的Y染色体将消失:人类会怎么样?
旅游景区清洁工人工作情况影像记录带定位时间时间水印相机
全球动态:父母去世了,为子女买的保险能用遗产续费吗?
天天讯息:高中教材选修和必修有什么区别_高中必修是什么意思 选修呢
油毡纸多少钱一卷(油毡纸) 环球播资讯
当前短讯!不负如来不负卿txt下载完整版_不负如来不负卿txt下载
UFOU首获投资,升降桌售价上万元有人望而却步,孟振亮曾连续创业
每日短讯:管理能力有哪些方面_能力有哪些方面
阿里云宣布举办首届AI黑客马拉松挑战赛 最终获胜团队将获得3万奖金
现实题材电影《八角笼中》发布一“骗”真心版预告 由王宝强与肖央主演
人造电子皮肤首次亮相 每层主干均为长分子链组成