BirtDateTime.addDay returns 新年前夜错了年份

BirtDateTime.addDay returns wrong year around new years eve

我有一个带有两个参数的 birt 报告,startDate 和 endDate(它们都是文本字段/字符串)。它们预先填充了昨天和昨天 + '23:59:59',因此格式看起来像 2019-12-202019-12-20 23:59:59.

这个函数分别是Formatter.format(BirtDateTime.addDay(BirtDateTime.today(), -1), "YYYY-MM-dd")Formatter.format(BirtDateTime.addDay(BirtDateTime.today(), -1), "YYYY-MM-dd 23:59:59")

今年年底前都可以正常使用。生成的日期如下所示:

| BirtDateTime.today() | Generated date |
| -------------------- | -------------- |
| 2019-12-29           | 2019-12-28     |
| 2019-12-30           | 2020-12-29     |
| 2019-12-31           | 2020-12-30     |
| 2020-01-01           | 2020-12-31     |
| 2019-01-02           | 2020-01-01     |

如您所见,从 2019-12-30 到 2020-01-01,addDay 函数生成的日期有错误的年份。我的第一个猜测是它必须与日历周做一些事情(因为新的一周从 2019-12-30 开始,但是在 1 月 2 日一切又好了...

如果我将 BirtDateTime.today() 替换为固定字符串 "2019-12-31" 或类似字符串,我可以重现此内容。如果我使用另一年,比如说 2018 年,只有 2019-01-01 会 return 错误的日期(2019-31-12 而不是 2018-12-31)。

有什么我没见过或没有人遇到过这种行为吗?如果重要的话,我正在使用 birt 2019-03。

我们遇到了完全相同的问题。

作为数字(BirtDateTime.diffDay(BirtDateTime.today(), BirtDateTime.addDay(BirtDateTime.today(), -10))) 是正确的 (-10) 问题出在别处。

使用 'yyyy' 而不是 'YYYY' 解决了这个问题。 参见 yyyy vs YYYY

YYYY 指定使用星期年份。使用 should 而不是使用 yyyy 来简单地使用实际日期的年份。

正如您在 BirtDateTime.java 源代码中看到的那样,SimpleDateFormat 用于格式化。 SimpleDateFormat 的 Javadoc 说

Letter | Date or Time Component

y | Year

Y | Week year