JFreeChart TimeSeries日期时间格式化及重复添加报错求助
问题根因
你当前使用的org.jfree.data.time.Day是日粒度的时间周期类,同一自然日的所有时间点都会被识别为同一个时间段。你两次采样都在11月20日,所以会被判定为重复时间段触发报错。
同时你的代码还存在一个逻辑错误:timeSeriesCollectionTemps.addSeries(timeSeries)放在了循环内部,会重复往数据集里添加同一个时序对象,后续绘图会触发异常。
修复方案
1. 替换时间周期类为分钟粒度
将你报错行的new Day(gc.getTime())替换为new Minute(gc.getTime()),Minute是JFreeChart提供的分钟级时间周期类,刚好匹配你30分钟的采样间隔,不会出现同周期重复的问题。
2. 调整数据集添加时序的逻辑
把timeSeriesCollectionTemps.addSeries(timeSeries)移到循环结束后执行。
3. 配置X轴显示格式为「月-日-时-分」
绘图时对X轴做日期格式自定义即可。
修复后完整代码示例
import org.jfree.data.time.Minute; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import java.text.SimpleDateFormat; import java.util.GregorianCalendar; import java.util.Date; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.plot.XYPlot; // ... 你的其他业务代码 TimeSeries timeSeries = new TimeSeries("温度"); TimeSeriesCollection timeSeriesCollectionTemps = new TimeSeriesCollection(); long time = time_stamp.getTime().getTime() + owc.getFirstLogOffset(state); GregorianCalendar gc = new GregorianCalendar(); for (int i = 0; i < log.length; i++){ gc.setTime(new Date(time)); System.out.println(gc.getTime() + ": " + Convert.toFahrenheit(owc.decodeTemperature(log [i])) + " F"); time += sample_rate * 60 * 1000; double temp = Convert.toFahrenheit(owc.decodeTemperature(log[i])); // 替换为Minute粒度 timeSeries.add(new Minute(gc.getTime()), temp ); } // 循环结束后再添加时序到数据集 timeSeriesCollectionTemps.addSeries(timeSeries); // 绘图时设置X轴格式 JFreeChart chart = ChartFactory.createTimeSeriesChart( "医疗设备温度变化曲线", "时间", "温度(°F)", timeSeriesCollectionTemps, true, true, false ); XYPlot plot = chart.getXYPlot(); DateAxis xAxis = (DateAxis) plot.getDomainAxis(); // 自定义X轴显示格式:月-日-时-分 xAxis.setDateFormatOverride(new SimpleDateFormat("MM-dd-HH-mm"));
补充说明
如果你的业务场景确实存在同一分钟多个采样点的情况,可以将add()方法替换为addOrUpdate(),新值会覆盖同一周期的旧值,不会触发重复报错。
内容的提问来源于stack exchange,提问作者Noah Michael
相关产品推荐
相关产品推荐

