Java разделить дату и период времени и вернуть массив - PullRequest
0 голосов
/ 03 июля 2018

Я создаю веб-приложение в java с использованием простого jsp, я хотел бы знать, есть ли способ получить массив значений datetime между datetime_start и datetime_stop для hours/day/minutes/etc. Я ищу что-то подобное:

Array getvalues(datetime_start, datetime_stop, "day/hours/min")

например:

getvalues("2018-07-02 20:25:08.208812","2018-07-03 20:25:08.208812","hours");

возвращает:

2018-07-02 20:25:08.208812 <br>
2018-07-02 21:25:08.208812<br>
2018-07-02 22:25:08.208812<br>
2018-07-02 23:25:08.208812<br>
2018-07-02 24:25:08.208812<br>
2018-07-02 01:25:08.208812<br>
2018-07-02 02:25:08.208812<br>
2018-07-02 03:25:08.208812<br>
2018-07-02 04:25:08.208812<br>
2018-07-02 05:25:08.208812<br>
2018-07-02 06:25:08.208812<br>
2018-07-02 07:25:08.208812<br>
2018-07-02 08:25:08.208812<br>
2018-07-02 09:25:08.208812<br>
2018-07-02 10:25:08.208812<br>
2018-07-02 11:25:08.208812<br>
2018-07-02 12:25:08.208812<br>
2018-07-02 13:25:08.208812<br>
2018-07-02 14:25:08.208812<br>
2018-07-02 15:25:08.208812<br>
2018-07-02 16:25:08.208812<br>
2018-07-02 17:25:08.208812<br>
2018-07-02 18:25:08.208812<br>
2018-07-02 19:25:08.208812<br>
2018-07-02 20:25:08.208812<br>

Может ли кто-нибудь помочь мне?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Это простой способ получить желаемый результат. Возможно, вы захотите добавить больше проверок, например, проверку правильности ввода и обработку.

Класс утилит, содержащий основную логику:

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

Основные идеи в этом решении:

  1. Используйте DateTimeFormatter , чтобы указать желаемый формат;
  2. LocalDateTime.isBefore () вернет false для того же LocalDateTime , поэтому вам следует использовать ! IsAfter () , если вы хотите включить endDateTime , если это правильный результат;
  3. Используйте постоянный ( static final ) форматер, чтобы заставить пользователей функции использовать определенный формат. Однако, если вам нужно решение, которое поддерживает переменную DateTimeFormatter , вы также можете сделать это, сделав атрибут formmater непостоянным (или просто добавив его в качестве параметра метода, который может НЕ быть желательным, поскольку вы в итоге получится слишком много аргументов);
  4. Используйте перечисление для управления набором ChronoUnit , разрешенным для периода. Это не только обеспечит более чистый и более управляемый код, но также даст вам больший контроль над логикой и, следовательно, менее подвержено ошибкам;
0 голосов
/ 03 июля 2018

С java.time вы можете реализовать свой собственный способ сделать это. Простым примером для начала может быть:

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
final LocalDateTime dateFirst = LocalDateTime.parse("2018-07-02 20:25:08.208812", formatter);
final LocalDateTime dateLast = LocalDateTime.parse("2018-07-03 20:25:08.208812", formatter);

final ChronoUnit unit = ChronoUnit.valueOf("HOURS");

final List<String> dates = new ArrayList<>();
for (LocalDateTime dateBetween = dateFirst; !dateBetween.isAfter(dateLast); dateBetween = dateBetween.plus(Duration.of(1, unit))) {
    dates.add(dateBetween.format(formatter));
}

System.out.println(dates);

Как видите, вы можете добавить некоторые настройки:

  • формат даты, поскольку LocalDateTime ожидает T, а не пробел между датой и временем. Вы можете реализовать свой собственный форматер и присвоить ему LocalDateTime#parse, если вы хотите сохранить свой формат
  • вы можете получить тип устройства динамически, но вы должны указывать его заглавными буквами
  • Я составил список, но вы можете легко преобразовать его в массив (с помощью dates.toArray(new String[dates.size()])) или использовать unit.between(dateFirst, dateLast), чтобы заранее узнать размер массива, если вы хотите сделать с ним другие вещи во время сборки массив.

С этим вы можете создать свой собственный метод, который следует вашему API и логике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...