Является ли результирующий код java.time большим количеством операторов кода по сравнению с эквивалентным кодом календаря - PullRequest
0 голосов
/ 25 октября 2018

В последнее время я пытаюсь портировать одну из наших старых кодовых баз, от Calendar до java.time, поскольку нам нужен целый ряд арифметических функций, которые можно найти только в java.time.

Если мы используем Calendar в нашей текущей кодовой базе, нам нужно выполнить много преобразований туда-сюда (с Calendar до Instant, с Instant обратно до Calendar), в серединенаш код.

Чтобы избежать такого громоздкого преобразования, мы решили исключить использование Calendar и перенести их на эквивалентный java.time код.

Янемного скептически по поводу моего порта.По сравнению с кодом календаря

  • создает больше временных экземпляров объектов в цикле while.
  • Требуется больше операторов кода.

Код календаря

// reminderCal is Calendar object.

long startTimestamp = getStartTimestamp();
reminderCal.setTimeInMillis(startTimestamp);

while (startTimestamp <= maxTimestamp) {
    resultList.add(startTimestamp);

    reminderCal.add(Calendar.DAY_OF_MONTH, 1);

    startTimestamp = reminderCal.getTimeInMillis();
}

return resultList;

java.time code

// Epoch timestamp loopTs as initial input.

long startTimestamp = getStartTimestamp();
final ZoneId zoneId = ZoneId.systemDefault();

while (startTimestamp <= maxTimestamp) {
    resultList.add(startTimestamp);

    // More code, more temporary instances required compared
    // with Calendar's version. Not sure we're doing the right
    // way.
    Instant instant = Instant.ofEpochMilli(startTimestamp);
    LocalDateTime time = LocalDateTime.ofInstant(instant, zoneId);
    time = time.plus(1, ChronoUnit.DAYS);

    startTimestamp = time.atZone(zoneId).toInstant().toEpochMilli();
}

return resultList;

Для приведенного выше кода мне было интересно, правильно ли мы делаем порт и оптимизировали его?Есть ли какая-нибудь комната, которую мы можем улучшить в нашем порту java.time?

1 Ответ

0 голосов
/ 25 октября 2018

Так как вы хотите манипулировать датами между временами в данном часовом поясе, вы не должны использовать ни миллисекунды, ни LocalDateTime, а ZonedDateTime.И я бы сказал, что ваш список должен содержать Instants вместо long, но давайте пока оставим это так:

long startTimestamp = getStartTimestamp();
ZoneId zoneId = ZoneId.systemDefault();

ZonedDateTime maxDateTime = Instant.ofEpochMilli(maxTimestamp).atZone(zoneId);
ZonedDateTime loopDateTime = Instant.ofEpochMilli(loopTs).atZone(zoneId);

while (!loopDateTime.isAfter(maxDateTime)) {
    tsList.add(loopDateTime.toInstant().toEpochMilli());
    loopDateTime = loopDateTime.plusDays(1);
}

Это более кратко, но и более читабельно.И все вызовы Instant.ofEpochMilli() и toEpochMilli() не понадобятся, если вы будете использовать Instants вместо long.

...