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);
}