Elasticsearch时长字段在Kibana DataView显示异常求助
解决Elasticsearch时间差字段在Kibana中显示为纪元日期的问题
问题原因
你用date类型存储HH:mm:ss格式的时间差时,Elasticsearch会自动补全日期部分为1970-01-01(Unix纪元起始日),将其转换为时间戳存储。Kibana读取该时间戳后,默认按完整日期格式渲染,因此显示为1 Jan 1970 00:01:20。
解决方案
场景1:已写入大量数据,不想重新索引
通过Kibana的脚本字段,将存储的时间戳转换回HH:mm:ss格式:
- 进入Kibana的「Stack Management」→「Data Views」,选中目标数据视图。
- 切换到「Scripted fields」标签,点击「Add scripted field」。
- 填写字段名(例如
duration_formatted),脚本语言选择「Painless」,输入以下脚本:ZonedDateTime dt = doc['duration'].value; return String.format("%02d:%02d:%02d", dt.getHour(), dt.getMinute(), dt.getSecond()); - 字段类型选择「String」,保存后,在可视化或数据表格中使用这个新字段即可显示原始的时分秒格式。
场景2:数据量不大,可重新索引(推荐)
不建议用date类型存储时间差(date是时间点而非时间间隔),推荐两种更合理的存储方式:
方案A:用keyword类型存储原始字符串
修改索引映射,将duration字段类型改为keyword:
{ "mappings": { "properties": { "duration": { "type": "keyword" } } } }
重新写入数据后,Kibana会直接显示00:01:20格式。缺点是无法直接对时间差做聚合计算(如求和、平均值)。
方案B:存储为总秒数+Kibana格式化
将时间差转换为总秒数(例如00:01:20存为80),用integer类型存储:
{ "mappings": { "properties": { "duration_seconds": { "type": "integer" } } } }
然后在Kibana中设置字段格式化:
- 在目标数据视图的字段列表中,找到
duration_seconds字段,点击「Edit」。 - 在「Format」选项中选择「Duration」,单位设为「Seconds」,显示格式选择
HH:mm:ss。
这种方式既支持Kibana显示时分秒格式,又能正常进行时间差的聚合计算。
内容的提问来源于stack exchange,提问作者MaiTruongSon
相关产品推荐
相关产品推荐

