首页 > 解决方案 > 使用 java.time.Clock.offset 以任意开始时间递增时间

问题描述

我想要一个设置为任意时间的时钟,然后以一秒为增量滴答作响。

例如,以“14:55:20”开头。然后我的应用程序应该在一秒钟内输出“14:55:20”、“14:55:21”、“14:55:22”等等。

这似乎Clock.offset就是为了做到这一点。引用文档:

获取一个时钟,该时钟从指定的时钟返回具有指定持续时间的瞬间

所以我尝试了以下方法:

LocalTime localTime = LocalTime.parse( "14:55:20" );
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ).with( localTime );
Duration duration = Duration.between( odt.toInstant() , Instant.now() );
Clock clock = Clock.offset( Clock.systemUTC() , duration );

System.out.println( "odt = " + odt );
System.out.println( "duration = " + duration );

for ( int i = 1 ; i < 10 ; i++ )
{
    LocalTime lt = OffsetDateTime.now( clock ).truncatedTo( ChronoUnit.SECONDS ).toLocalTime();
    System.out.println( "localTime = " + lt );
    try
    {
        Thread.sleep( TimeUnit.SECONDS.toMillis( 1 ) );
    }
    catch ( InterruptedException e )
    {
        e.printStackTrace();
    }
}

我最初的出发点odt似乎是正确的。但后来我的呼吁OffsetDateTime.now( clock )并没有产生预期的结果。

odt = 2019-10-31T14:55:20Z

持续时间 = PT-10H-29M-4.832902S

本地时间 = 17:57:10

本地时间 = 17:57:11

本地时间 = 17:57:12

➥ 我没有正确使用Clock.offset?还是我在这里误解了一些概念?

标签: javaclock

解决方案


持续时间是错误的方式:

Duration duration = Duration.between( Instant.now(), odt.toInstant() ); // Flipped arguments

输出

odt = 2019-10-31T14:55:20Z
duration = PT8H1M41.0216146S
localTime = 14:55:20
localTime = 14:55:21
localTime = 14:55:22
localTime = 14:55:23
localTime = 14:55:24
localTime = 14:55:25
localTime = 14:55:26
localTime = 14:55:27
localTime = 14:55:28

推荐阅读