Это простой способ получить желаемый результат. Возможно, вы захотите добавить больше проверок, например, проверку правильности ввода и обработку.
Класс утилит, содержащий основную логику:
public class PeriodicDateTimeProducer {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
public List<LocalDateTime> getPeriodicDateTime(String start, String end, PeriodMeasure measure){
LocalDateTime startDateTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER);
LocalDateTime endDateTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER);
List<LocalDateTime> results = new ArrayList<>();
// Use isAfter instead of isBefore becoz you want to include the endDateTime, if it's a valid result
while(!startDateTime.isAfter(endDateTime)){
results.add(startDateTime);
startDateTime = startDateTime.plus(1, measure.getChronoUnit());
}
return results;
}
}
Перечисление, которое помогает вам ограничить количество используемых единиц. Это также помогает уменьшить количество ошибок, вызванных опечатками:
public enum PeriodMeasure{
DAY(ChronoUnit.DAYS),
HOUR(ChronoUnit.HOURS),
MINUTE(ChronoUnit.MINUTES);
PeriodMeasure(ChronoUnit unit){
this.unit = unit;
}
private ChronoUnit unit;
public ChronoUnit getChronoUnit(){
return this.unit;
}
}
Класс тестера:
public class TestPeriodicDateTime {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
public static void main (String... args){
PeriodicDateTimeProducer dateTimeUtil = new PeriodicDateTimeProducer();
List<LocalDateTime> rst = dateTimeUtil.getPeriodicDateTime("2018-07-02 20:25:08.208812", "2018-07-03 20:25:08.208812", PeriodMeasure.HOUR);
rst.forEach(r -> System.out.println(DATE_TIME_FORMATTER.format(r)));
}
}
Результат:
2018-07-02 20:25:08.208812
2018-07-02 21:25:08.208812
2018-07-02 22:25:08.208812
2018-07-02 23:25:08.208812
2018-07-03 00:25:08.208812
2018-07-03 01:25:08.208812
2018-07-03 02:25:08.208812
2018-07-03 03:25:08.208812
2018-07-03 04:25:08.208812
2018-07-03 05:25:08.208812
2018-07-03 06:25:08.208812
2018-07-03 07:25:08.208812
2018-07-03 08:25:08.208812
2018-07-03 09:25:08.208812
2018-07-03 10:25:08.208812
2018-07-03 11:25:08.208812
2018-07-03 12:25:08.208812
2018-07-03 13:25:08.208812
2018-07-03 14:25:08.208812
2018-07-03 15:25:08.208812
2018-07-03 16:25:08.208812
2018-07-03 17:25:08.208812
2018-07-03 18:25:08.208812
2018-07-03 19:25:08.208812
2018-07-03 20:25:08.208812
Process finished with exit code 0
Основные идеи в этом решении:
- Используйте DateTimeFormatter , чтобы указать желаемый формат;
- LocalDateTime.isBefore () вернет false для того же LocalDateTime , поэтому вам следует использовать ! IsAfter () , если вы хотите включить endDateTime , если это правильный результат;
- Используйте постоянный ( static final ) форматер, чтобы заставить пользователей функции использовать определенный формат. Однако, если вам нужно решение, которое поддерживает переменную DateTimeFormatter , вы также можете сделать это, сделав атрибут formmater непостоянным (или просто добавив его в качестве параметра метода, который может НЕ быть желательным, поскольку вы в итоге получится слишком много аргументов);
- Используйте перечисление для управления набором ChronoUnit , разрешенным для периода. Это не только обеспечит более чистый и более управляемый код, но также даст вам больший контроль над логикой и, следовательно, менее подвержено ошибкам;