在java.time中可以查询时间单位的精度:
java.time.Instant.now().query(java.time.temporal.TemporalQueries.precision())
当我这样做时,我得到的响应是瞬间具有精度:java.time.temporal.ChronoUnit/NANOS
。
是否有可能知道一个瞬间是否只有足够的信息:java.time.temporal.ChronoUnit/MINUTES
(或另一个可以打包到瞬间的时间单位,例如秒,小时等)?
最佳答案
tl;dr
instant.truncatedTo( someChronoUnit ).equals( instant )
截断
如您所述, TemporalQueries.precision
返回 TemporalQuery<TemporalUnit>
表示数据类型的能力,而不是该类型实例的内容。
我不知道有什么直接方法可以确定 Instant
内容的重要(非零)粒度.但是你可以通过 truncating 破解方法对于每个粒度级别,直到找到不再匹配原始 Instant
的结果实例。
ChronoUnit
Java 中的枚举定义了 java.time 中的粒度级别,并实现了 TemporalUnit
界面。循环遍历相关的ChronoUnit
枚举对象(小时、分钟、秒、纳米),截断目标 Instant
反对每一个。
for ( ChronoUnit unit : List.of( ChronoUnit.HOURS , ChronoUnit.MINUTES , ChronoUnit.SECONDS , ChronoUnit.NANOS ) )
{
if ( instant.truncatedTo( unit ).equals( instant ) ) { return unit; }
}
完整示例代码。
package work.basil.example.datetime;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Objects;
public class Granularity
{
private final static List < java.time.temporal.ChronoUnit > CHRONO_UNITS = List.of( ChronoUnit.HOURS , ChronoUnit.MINUTES , ChronoUnit.SECONDS , ChronoUnit.NANOS );
public static ChronoUnit resolve ( final Instant instant )
{
Objects.requireNonNull( instant );
for ( ChronoUnit unit : Granularity.CHRONO_UNITS )
{
if ( instant.truncatedTo( unit ).equals( instant ) ) { return unit; }
}
throw new IllegalStateException(); // Should never reach this point.
}
public static void main ( String[] args )
{
Instant instant = Instant.parse( "2021-01-23T12:00:00.000000123Z" );
ChronoUnit unit = Granularity.resolve( instant );
System.out.println( "unit = " + unit );
}
}
您也可以通过调用 Instant#get
来做类似的事情为每个部分(每个 ChronoField
)测试非零值。
关于java - 根据分钟、秒、毫秒等确定瞬间的精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66578188/