代码之家  ›  专栏  ›  技术社区  ›  ChicoTabi

如何使用Java中的Instant类来获取特定小数点的运行时间(以秒为单位)?

  •  3
  • ChicoTabi  · 技术社区  · 2 周前

    有什么方法可以使用吗 Instant 类,以获取以秒为单位的运行时间到一定数量的小数点?我花了一些时间进行实验,并能够使用 .now() 方法在程序中的两个独立点处,并将它们相减以获得经过的时间。然而,我的问题是我无法将秒数精确到特定的小数点。

    1 回复  |  直到 1 周前
        1
  •  3
  •   Robby Cornelissen    1 周前

    如果你有两个 Instant 实例,可以找到持续时间 between 无论你选择什么时间单位。

    对于您的特定用例,由于所需小数点的数量是未指定的,因此可能最容易获得 nanoseconds (这给了你最高的精度),把这个数字除以 1e+9 (一秒钟内的纳秒数),然后四舍五入和/或格式化为所需的小数位数。

    import static java.time.temporal.ChronoUnit.NANOS;
    import java.time.Instant;
    
    class Test {
        public static void main(String[] args) throws InterruptedException {
            Instant start = Instant.now();
            Thread.sleep(320);
            Instant end = Instant.now();
            
            long nanos = NANOS.between(start, end);
            double seconds = (double) nanos / 1e9;
            
            System.out.println(String.format("%,.4f seconds", seconds));
        }
    }
    

    这将生成如下输出:

    0.3202 seconds
    
        2
  •  0
  •   JodaStephen    1 周前

    您可以使用 truncatedTo .

     public static void main(String[] args) throws InterruptedException {
       Instant start = Instant.now().truncatedTo(ChronoUnit.SECONDS);
       // code being timed
       Instant end = Instant.now().truncatedTo(ChronoUnit.SECONDS);
       Duration duration = Duration.between(start, end);
    

    您也可以使用 Clock.tickSeconds(ZoneId) :

     public static void main(String[] args) throws InterruptedException {
       Clock clock = Clock.tickSeconds(ZoneId.systemDefault());
       Instant start = Instant.now(clock);
       // code being timed
       Instant end = Instant.now(clock);
       Duration duration = Duration.between(start, end);