确定以分钟、秒、毫秒等为单位的瞬间精度?



java。Time可以查询时间单位的精度:

java.time.Instant.now().query(java.time.temporal.TemporalQueries.precision())

当我这样做时,我得到一个即时具有精度的响应:java.time.temporal.ChronoUnit/NANOS.

是否有可能知道一个瞬间是否只有足够的信息:java.time.temporal.ChronoUnit/MINUTES(或另一个时间单位,可以装进一个瞬间,如秒,小时等)?

br

instant.truncatedTo( someChronoUnit ).equals( instant )
<标题>截断h1> 您所述,TemporalQueries.precision返回的TemporalQuery<TemporalUnit>表示该数据类型的能力,而不是该类型实例的内容

我不知道确定Instant内容的显著(非零)粒度的直接方法。但是,您可以通过截断每个粒度级别的方法,直到找到不再与原始Instant实例匹配的结果。

Java中的ChronoUnit枚举定义了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 );
}
}

你也可以做类似的事情,为每个部分(每个ChronoField)调用Instant#get来测试非零值。

一种方法是使用truncatedTo方法将该瞬间与另一个瞬间进行比较。

例如

Instant one = Instant.now();
Instant two = Instant.ofEpochSecond(one.getEpochSecond());
System.out.println(one);
System.out.println(two);
Instant three = one.truncatedTo(ChronoUnit.SECONDS);
System.out.println(three);

这个打印

2021-03-11T07:43:43.579704700Z
2021-03-11T07:43:43Z
2021-03-11T07:43:43Z

二和三是相等的。

一般情况下,如果"raw"如果瞬间等于基于计时单位(秒、分等)的截短的自身,则该瞬间只有足够的信息用于指定的计时单位。

之类的
boolean onlyEnoughFor(Instant instant, ChronoUnit unit) {
return instant.truncatedTo(unit).equals(instant);
}

相关内容

  • 没有找到相关文章