You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Primefaces LineChart在谷歌Chrome浏览器中日期值显示异常求助

PrimeFaces Line Chart X轴日期在Chrome显示异常的解决方案

这个问题我之前也碰到过,本质是不同浏览器对日期字符串的解析规则差异导致的,给你梳理下原因和靠谱的解决办法:

问题回顾

你在用PrimeFaces 6.2(包括6.3快照版)的Line Chart组件展示按日期维度的数值数据时,发现Chrome 72里X轴日期显示完全不对,但IE11和Firefox能正常展示。后来移除tickInterval后还发现,Chrome会把欧式格式的日期(比如03.09.2019)错误解析成美式的09.03.2019,这就坐实了浏览器解析差异的问题。

原因分析

核心问题出在浏览器原生的Date.parse()方法上:

  • IE和Firefox对.分隔的dd.MM.yyyy格式日期,会默认按欧式规则(日.月.年)解析;
  • Chrome则会优先按美式规则尝试解析,把.当作分隔符时,会把前两位识别为月份,后两位识别为日期,直接导致日期错位。
    而PrimeFaces的Chart组件底层依赖的绘图库(jqPlot)在处理字符串类型的X轴日期数据时,会直接调用浏览器的这个原生方法,自然就出现了跨浏览器的不一致。

解决方法

最稳妥的方式是绕开字符串日期解析,改用时间戳(long型的毫秒数)作为X轴的数据值,让绘图库直接处理数值型的日期数据,彻底避免浏览器解析差异的问题。

代码修改对比

原代码(存在问题):

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
// 用格式化后的字符串设置数据点
dataSeries.set(sdf.format(cal.getTime()), i);
// 用字符串设置X轴最大值
axis.setMax(sdf.format(new Date()));

修改后的代码(解决问题):

// 直接用Date的时间戳(毫秒数)设置数据点
dataSeries.set(cal.getTime().getTime(), i);
// 同样用时间戳设置X轴最大值
axis.setMax((new Date()).getTime());

其他DateAxis的配置可以保留不变,确保tickFormat正确即可:

DateAxis axis = new DateAxis("Datum");
axis.setTickAngle(-50);
axis.setTickInterval("3 weeks");
axis.setTickFormat("%d.%m.%y");
lineChartModel.getAxes().put(AxisType.X, axis);

验证效果

修改后,Chrome、IE和Firefox都会基于时间戳正确解析并渲染日期,X轴的日期显示会完全一致,再也不会出现错位的情况。这种方式也避开了时区、区域设置带来的潜在影响,是跨浏览器兼容的最优解。

内容的提问来源于stack exchange,提问作者Basti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:18:30