Извините за задержку с ответом, но ОЧЕНЬ большое спасибо за ваши предложения о том, как настроить время на часах. Ваши «отступающие» замечания также очень ценны. Большинство моих удобных методов в настоящее время настолько коротки - большинство - всего одна или две строки - что я ожидаю полностью отказаться от этих методов и выполнить работу в моих программах. Мне очень нравятся эти классы java.time!

я есть несколько старых вспомогательных методов, написанных с использованием Calendars, которые я хочу обновить, чтобы использовать классы Java.time. *, Представленные в Java 8. Некоторые из методов в моем классе получают такие значения, как текущее время или даже только текущий час.

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

Я пытаюсь понять две основные вещи:

Как получить текущую метку времени в моих методах.Как провести модульное тестирование моих результатов с помощьюразные источник текущей метки времени.

Что касается самих методов, я склонен создать ZonedDateTime следующим образом:

LocalDateTime currentDateTime = LocalDateTime.now();
ZoneId timeZoneDefault = ZoneId.systemDefault(); 
ZonedDateTime currentZonedDateTimeDefault = ZonedDateTime.of(currentDateTime, timeZoneDefault);

Затем я бы использовал DateTimeFormatter, чтобы получить ту часть результата, которая мне действительно нужна. Например, если бы я хотел текущий час от 24-часовых часов, а затем от 12-часовых часов, я бы сделал это:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("kk");
System.out.println("currentHour (24 hour clock): " + currentZonedDateTimeDefault.format(fmt));
DateTimeFormatter fmt2 = DateTimeFormatter.ofPattern("hh a");
System.out.println("currentHour (12 hour clock): " + currentZonedDateTimeDefault.format(fmt2));

Пока это нормально, или я должен использовать другой подход, возможно, с помощью Instant?

Моя главная проблема - найти другой способ получить текущее время для моих модульных тестов, чтобы я мог сравнить ожидаемые результаты с реальными. Я читал о Clocks и Instants и так далее, и чем больше я читаю, тем больше я запутываюсь. Некоторые подходы, похоже, получают текущее время из одного и того же источника, поэтому они предположительно покажут, что ожидаемый результат ВСЕГДА совпадает с фактическим результатом - но тогда ОБА может быть ошибочной в том же духе.

Может ли кто-нибудь подсказать мне лучший способ вычислить текущее время в заданном часовом поясе, которое получает время вразные чем я использую в своем методе?

ОБНОВЛЕНИЕ: я работаю над своими удобными методами и использую это в каждом методе, который начинается с получения текущей даты и времени:

    LocalDateTime now = LocalDateTime.now();
    ZonedDateTime nowLocalTimeZone = ZonedDateTime.of(now, ZoneId.systemDefault());

Затем я получаю ту часть даты / времени, которую я на самом деле хочу, с таким кодом:

try {
        DateTimeFormatter format = DateTimeFormatter.ofPattern(MONTH_NUMBER_FORMAT);
        return Integer.parseInt(nowLocalTimeZone.format(format));
    }
    catch (DateTimeParseException excp) {
        throw excp;         
    }

Обратите внимание, что в методах все основано на LocalDateTime.now () без указания часов.

В моих модульных тестах я получил это как переменную класса:

    private Clock localClock = Clock.fixed(Instant.now(), ZoneId.systemDefault());

В типичном модульном тесте у меня есть такой код:

@Test
@DisplayName ("getCurrentMonthNumberLocal()")
void testGetCurrentMonthNumberLocal() {

    LocalDateTime now = LocalDateTime.now(localClock);
    ZonedDateTime nowLocalTimeZone = ZonedDateTime.of(now, ZoneId.systemDefault());

    //Normal cases
    assertEquals(nowLocalTimeZone.getMonthValue(), CurrentDateTimeUtils.getCurrentMonthNumberLocal());
}

Обратите внимание, что этот подход предполагает использование фиксированных часов с именем localClock в качестве источника ожидаемого результата.

Когда я запускаю тесты, ожидаемые результаты соответствуют фактическому результату (по крайней мере, для тех немногих классов, которые я выполнил до сих пор, которые ищут номер года и месяца).

Гарантирует ли этот подход, что я получаю текущее время из двух РАЗНЫХ источников, чтобы сравнение было достоверным? Или я эффективно получаю ту же информацию из того же источника, например, системные часы на моем компьютере?

Я очень хочу, чтобы дата / время, которое я получаю из методов, были получены из источника, отличного от даты / времени, использованного для определения ожидаемых результатов в моих модульных тестах, так что я уверен, что это действительный тест, иначе я не Не вижу особого смысла в тестировании этих методов. (Полагаю, я мог бы просто отобразить результаты каждой функции и посмотреть, выглядит ли она примерно правильно. Довольно легко определить, верны ли год, месяц и день, если, возможно, вы не очень близки к концу того года, месяца или день, в этом случае вы можете видеть значения для другого часового пояса и не знать его.)

Ответы на вопрос(1)

Ваш ответ на вопрос