Jsf jqPlot/Primefaces扩展器和日期值存在问题

Jsf jqPlot/Primefaces扩展器和日期值存在问题,jsf,date,charts,primefaces,jqplot,Jsf,Date,Charts,Primefaces,Jqplot,事情是这样的。 我有很多持久化的“快照”,其中包含java.sql.Timestamp和(为了简单起见)int作为数据 我有一个JSF页面,其中包含一个primefaces 3.4.1,后面是一个ManagedBean,其中包含图表的模型 假设我然后选择一个时间范围并获取该范围内的所有快照。 并使用所有时间戳(x轴)和所有整数(y轴)填充图表的数据模型 因此,我在填充时所做的是: data = new HashMap<Object, Number>(); List&l

事情是这样的。 我有很多持久化的“快照”,其中包含java.sql.Timestamp和(为了简单起见)int作为数据

我有一个JSF页面,其中包含一个primefaces 3.4.1
,后面是一个ManagedBean,其中包含图表的模型

假设我然后选择一个时间范围并获取该范围内的所有快照。 并使用所有时间戳(x轴)和所有整数(y轴)填充图表的数据模型

因此,我在填充时所做的是:

data = new HashMap<Object, Number>();        
List<Snapshot> allSnapshots = persistenceService.getAllSnapshots();
for(int i = 0; i < allSnapshots.size(); i++) {
    Snapshot s = allSnapshots.get(i);
    data.put(new Date(s.getTimestamp().getTime()), s.getData());
}
chartModel.getSeries().get(0).setData(data);
这是它的当前版本。。 经过数小时的阅读和反复尝试,我仍然无法正确理解,因为以下事情永远不会正确:

  • 刻度线永远不会呈现,因为日期永远不会转换。 目前,这只是被忽略,而formatString本身被忽略 显示
  • 在实际数据的左侧和右侧创建额外的记号, 我不想那样
  • 当我只为jqplot扩展器提供
    autoscale:true
    选项时, 我只希望标记之间的间距变好。但是什么 然后发生的情况是,间距很小,但与原始日期相同 标签变成了从0到可用数据量的纯数字
处理这件事我有点累了……也许我做错了什么。否则我不知道这为什么这么复杂

谢谢你的建议

干杯

克里斯


编辑:

好的,多亏了perissf,我检查了这个:

使用建议的扩展器,我得到以下输出:

(很抱歉,由于新的用户限制,我无法直接发布图像:-/)

正如您所看到的,记号被正确地渲染为HH:MM,这非常好。 但是你也可以看到另一个非常奇怪的问题发生了:

快照的给定时间范围为

  • 开始时间:2013-01-2813:01:25.415
  • 结束时间:2013-01-2813:14:32.145
当JVM在glassfish配置中被设置为UTC时,我使用System.currentTimeMillis()将它们收集为UTC时间戳

正如您所注意到的,绘图中的数据点移动了一个小时,它们从14:01开始,看起来这些值已经自动转换为我当前的时区,即UTC+1。但最左边的xaxis记号位于13:00时原始UTC值附近

我收集UTC时间戳,因为我不知道应用程序将在哪个实际时区运行,但我想显示“转换”的时间值。因此,自动切换到我的时区是一个不错的功能,但xaxis缩放实际上并不好,也不奇怪

有什么建议可以帮我解决吗

干杯

克里斯


编辑2:

好的,在用Firebug调试呈现的页面时,我偶然发现plot对象中的jqplot内部变量,它似乎包含xaxis的最小值和最大值。 Min设置为原始的Min UTC值,约为13:00,max设置为14:15左右的移动UTC+1值

不知何故,最小值不会根据自动时区调整而相应移动

所有其他值,即数据边界、数据本身等等,都被很好地移动了一个小时

我在一家报纸上发表了一篇文章

让我看看

再见


Chris

我最终调试了jqplot渲染器,并找到了导致这种行为的一些代码行

对于任何感兴趣的人,请在此处的评论部分查找错误修复:


感谢您的帮助

我对此修复非常感兴趣,但BitBucket上的问题位于受限区域,因此我无法访问它。所以我不得不自己尝试修复这个问题,幸运的是我做到了:)

因此Primefaces(6.0)图表使用了JQPlot库的旧版本。此版本中的一个错误将最小日期轴绑定设置为不精确的第一个值,而是根据用户浏览器的区域设置时区设置的较旧时间。例如,如果第一个值为12:00,且您的GMT为GMT+1,则日期轴界限最小值将为11:00,而不是12:00

明维尔酒店

下面的行(在createTicks函数中)应该被替换(注意代码写在下面)

下一行:

ad = Math.floor((ad.getTime() - ad.getUtcOffset())/r) * r + ad.getUtcOffset();
要替换的非小型线路:

min = min.getTime()  + min.getUtcOffset();
与:


请注意,我已尝试将Primefaces的chart.js更新为早期版本,但该图表不再有效。我将等待Primefaces的下一次更新,希望使用更新的版本。我也不知道Primefaces 6.0中使用了哪个版本的JQPlot相关:谢谢!我真的在谷歌上搜索过我的***了,但那一个漏掉了。我会在那里检查提供的解决方案。太好了。让我们知道这个解决方案是否对你有效。好的,它有点有效……我将用新的问题编辑原始帖子。默认的xaxis设置将在两侧增加20%。可能您正在观察此功能。但是,您可以覆盖它。我从来没有这样做过,但这似乎是一个很容易的任务“我也不知道Primefaces 6.0中使用了哪个版本的JQPlot”很容易找到。检查PrimeFaces源。。。版本:1.0.8构建1250。而“等待”是错误的方法。主动报告这一点(已经有一个关于包含jqplot扩展的问题报告)是一条出路。请求更新的原因!!!
ad = ad.getTime() + ad.getUtcOffset();
ad = Math.floor((ad.getTime() - ad.getUtcOffset())/r) * r + ad.getUtcOffset();
min = min.getTime()  + min.getUtcOffset();
 min = Math.floor((min.getTime() - min.getUtcOffset())/tempti) * tempti + min.getUtcOffset();