逗号后超过 6 位数字(纳秒)的舍入瞬间

Sla*_*how 5 java datetime timestamp rounding java.time.instant

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

可以看到,逗号-后面有 6 位数字944921。但是如果我有更多数字怎么办,例如:2021-10-13T07:14:47.791616921Z. 我怎样才能正确地舍入这样Instant2021-10-13T07:14:47.791617Z

Ole*_*.V. 9

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

\n

为了获得这个结果,我首先添加 500 纳秒。然后截断。如果小数点后第七位是 4 或更少,它仍然是 9 或更少,因此它前面的数字没有改变,截断将进行我们想要的四舍五入。如果第 7 位小数为 5 或更多,则添加 500 纳秒将使其溢出,第 6 位小数将增加 1,第 7 位小数将在 0 到 4 的范围内结束。然后截断将有效地对我们想要的原始值进行舍入。

\n
    Instant sourceValue = Instant.parse("2021-10-13T07:14:47.791616921Z");\n    Instant rounded = sourceValue.plusNanos(500).truncatedTo(ChronoUnit.MICROS);\n    System.out.println(rounded);\n
Run Code Online (Sandbox Code Playgroud)\n

输出是所需的:

\n
\n

2021-10-13T07:14:47.791617Z

\n
\n

让\xe2\x80\x99s 也尝试一下边缘情况。

\n
    Instant sourceValue = Instant.parse("2021-10-13T07:14:00.000000499Z");\n
Run Code Online (Sandbox Code Playgroud)\n
\n

2021-10-13T07:14:00Z

\n
\n
    Instant sourceValue = Instant.parse("2021-10-13T07:14:59.999999500Z");\n
Run Code Online (Sandbox Code Playgroud)\n
\n

2021-10-13T07:15:00Z

\n
\n