【问题标题】:BirtDateTime.addDay returns wrong year around new years eve [duplicate]BirtDateTime.addDay 在新年前夜返回错误的年份[重复]
【发布时间】:2020-01-06 08:44:23
【问题描述】:

我有一个带有两个参数的 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 年 1 月 1 日,addDay 函数生成的日期有错误的年份。我的第一个猜测是它必须与日历周有关(因为新的一周从 2019 年 12 月 30 日开始,但在 1 月 2 日,一切又恢复正常了......

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

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

【问题讨论】:

    标签: eclipse birt


    【解决方案1】:

    YYYY 指定使用周年。使用应该使用yyyy 来简单地使用实际日期的年份。

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

    信 |日期或时间组件

    y |年份

    是的 |周年

    【讨论】:

    • 直到现在才知道区别。谢谢!
    【解决方案2】:

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

    由于 Number(BirtDateTime.diffDay(BirtDateTime.today(), BirtDateTime.addDay(BirtDateTime.today(), -10))) 是正确的 (-10) 问题出在其他地方。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多