0

我有带有TIMESTAMP字段的 postgresql,它有带有日期和时间的 Instant。例如:2021-10-13T15:04:24.944921Z

如您所见,逗号后面有 6 位数字- 944921。但是如果我有更多的数字,例如:2021-10-13T07:14:47.791616921Z. 我怎样才能正确地Instant四舍五入2021-10-13T07:14:47.791617Z

4

1 回答 1

1

代码很短,但需要一些解释。你是对的,我们拥有的最好的就是truncatedTo方法,而且它总是四舍五入。相反,我们想要我们在学校学到的半向上舍入:如果第 7 位小数为 4 或更少,则向下舍入。如果是 5 或更高,则向上取整。

为此,我首先添加 500 纳秒。然后截断。如果第 7 位小数是 4 或更少,它仍然是 9 或更少,所以它之前的数字没有改变,截断将做我们想要的四舍五入。如果第 7 位小数为 5 或更大,添加 500 纳秒会溢出,第 6 位小数将增加 1,第 7 位小数将在 0 到 4 范围内结束。然后截断将有效地对我们想要的原始值进行四舍五入。

    Instant sourceValue = Instant.parse("2021-10-13T07:14:47.791616921Z");
    Instant rounded = sourceValue.plusNanos(500).truncatedTo(ChronoUnit.MICROS);
    System.out.println(rounded);

输出是期望的:

2021-10-13T07:14:47.791617Z

让我们也试试边缘情况。

    Instant sourceValue = Instant.parse("2021-10-13T07:14:00.000000499Z");

2021-10-13T07:14:00Z

    Instant sourceValue = Instant.parse("2021-10-13T07:14:59.999999500Z");

2021-10-13T07:15:00Z

于 2021-10-15T08:54:08.670 回答