Извините за задержку с ответом, но ОЧЕНЬ большое спасибо за ваши предложения о том, как настроить время на часах. Ваши «отступающие» замечания также очень ценны. Большинство моих удобных методов в настоящее время настолько коротки - большинство - всего одна или две строки - что я ожидаю полностью отказаться от этих методов и выполнить работу в моих программах. Мне очень нравятся эти классы 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 в качестве источника ожидаемого результата.
Когда я запускаю тесты, ожидаемые результаты соответствуют фактическому результату (по крайней мере, для тех немногих классов, которые я выполнил до сих пор, которые ищут номер года и месяца).
Гарантирует ли этот подход, что я получаю текущее время из двух РАЗНЫХ источников, чтобы сравнение было достоверным? Или я эффективно получаю ту же информацию из того же источника, например, системные часы на моем компьютере?
Я очень хочу, чтобы дата / время, которое я получаю из методов, были получены из источника, отличного от даты / времени, использованного для определения ожидаемых результатов в моих модульных тестах, так что я уверен, что это действительный тест, иначе я не Не вижу особого смысла в тестировании этих методов. (Полагаю, я мог бы просто отобразить результаты каждой функции и посмотреть, выглядит ли она примерно правильно. Довольно легко определить, верны ли год, месяц и день, если, возможно, вы не очень близки к концу того года, месяца или день, в этом случае вы можете видеть значения для другого часового пояса и не знать его.)