Больше точности при сравнении двух дат с интервалом в два часа

$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));

и, при необходимости:

$datediff=abs($datediff);
0
задан JonB 16 January 2019 в 19:53
поделиться

1 ответ

Я предполагаю, что calculateExecutionStartTime возвращает время, которое составляет два часа назад по сравнению со временем, когда вы вызываете метод, и это то, что вы хотите проверить. В своем первом предложении я также предполагаю, что вы можете изменить метод, чтобы он возвращал современный Instant вместо устаревшего Date. Поскольку вы можете использовать java.time, современный Java-интерфейс даты и времени, это сразу выглядело бы как простое улучшение.

Проблема в том, что вызов может занять несколько миллисекунд, даже несколько секунд, и мы не знаем, в какой момент времени во время вызова он читает часы. Таким образом, нет тестирования с использованием assertEquals с ожидаемым временем. Вместо этого мы читаем часы до и после вызова. Тогда наш тест может полагаться на метод, считывающий часы в некоторый момент между нашими двумя вызовами. В большинстве случаев это позволит нам проверить возвращаемое время с небольшим запасом. Идея была уже представлена ​​Даудом ибн Каримом в комментарии.

@Test
public void testCalculateExecutionStartTime() {
    Instant timeBefore = Instant.now();
    Instant executionStartTime = proxy.calculateExecutionStartTime(
            properties.getMessageConfiguration().getExecutionStartTime());
    Instant timeAfter = Instant.now();

    Duration expectedTimeAgo = Duration.ofHours(2);
    Assert.assertFalse(executionStartTime.isBefore(timeBefore.minus(expectedTimeAgo)));
    Assert.assertFalse(executionStartTime.isAfter(timeAfter.minus(expectedTimeAgo)));
}

Обратите внимание на использование Instant.now() для чтения часов. Вам не нужно ZonedDateTime и ZoneOffset.

Если вы не можете изменить тип возвращаемого значения calculateExecutionStartTime, просто конвертируйте полученное из него Date:

    Instant executionStartTime = proxy.calculateExecutionStartTime(
                    properties.getMessageConfiguration().getExecutionStartTime())
            .toInstant();

Все остальное точно так же, как и раньше.

0
ответ дан Ole V.V. 16 January 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: