java - 根据分钟、秒、毫秒等确定瞬间的精度?

标签 java java-time

在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/

相关文章:

java - 修剪从 mongoDB 收到的 json 中的双引号

java - JSTL:for Each 循环迭代集合

java - 我该如何修复此方法

java - android java线程中的新ArrayAdapter

java - 如何在 Java-8 中显示普通纪元 ("CE")?

java - java.time.format.DateTimeFormatter.ISO_INSTANT 的格式字符串?

java - 将小写的短工作日解析为 Java 8 的时间 DayOfWeek

java - 为什么 LocalDateTime 没有 String 构造函数?

java - 为采用命令行输入的 Java 独立执行 JUnit 测试用例

java - 获取当前财政年度的开始日期