Использование java.time.Clock.offset для увеличения во времени с произвольным временем начала дня - PullRequest
1 голос
/ 31 октября 2019

Я хочу, чтобы часы были установлены на произвольное время суток, а затем тикали с шагом в одну секунду.

Например, начните с «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

localTime = 17: 57: 10

localTime = 17: 57: 11

localTime = 17: 57: 12

➥Я неправильно использую Clock.offset? Или я неправильно понимаю какую-то концепцию здесь?

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Длительность неверна:

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
0 голосов
/ 31 октября 2019

Я думаю, что вы можете просто проверить, изменилось ли число секунд, например, вы можете сделать это:

     public static void main(String[] args) {
        // hour of launch
        String startTime = getTime();
        // actual time;
        String time = getTime();
        // elapsed time in seconds.
        int elapsedTime = 0;

        while (true) {
            if(!time.equals(getTime())) {
                time = getTime();
                // Output actual time.
                System.out.println(time);
                elapsedTime += 1;         
            }
        }               
    }

    public static String getTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        return dateFormat.format(date); 
    }
...