我有带有TIMESTAMP
字段的 postgresql,它有带有日期和时间的 Instant。例如:2021-10-13T15:04:24.944921Z
。
如您所见,逗号后面有 6 位数字- 944921
。但是如果我有更多的数字,例如:2021-10-13T07:14:47.791616921Z
. 我怎样才能正确地Instant
四舍五入2021-10-13T07:14:47.791617Z
?
我有带有TIMESTAMP
字段的 postgresql,它有带有日期和时间的 Instant。例如:2021-10-13T15:04:24.944921Z
。
如您所见,逗号后面有 6 位数字- 944921
。但是如果我有更多的数字,例如:2021-10-13T07:14:47.791616921Z
. 我怎样才能正确地Instant
四舍五入2021-10-13T07:14:47.791617Z
?
代码很短,但需要一些解释。你是对的,我们拥有的最好的就是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