Дата Util в Java, который взорвется диапазон дат в неделях, месяце, квартале, году - PullRequest
4 голосов
/ 07 января 2010

Я ищу библиотеку java, которая при получении от и до даты выдала бы список дат в неделях, месяцах, кварталах или году, который наиболее применим. Я сделал это вручную, и я хотел знать, реализовано ли это и протестировано ли оно как часть стандартного пакета.

Пример

Учитывая 01.01.2009, 04.01.2009, он должен дать 1/1 / 2009,1 / 2 / 2009,1 / 3 / 2009,1 / 4/2009

Учитывая 01.01.2009, 14.01.2009 он должен дать 1/1 / 2009,1 / 7 / 2009,1 / 14/2009

надеюсь, что это ясно:)

Ответы [ 4 ]

8 голосов
/ 07 января 2010

Класс DateTime , предоставляемый Joda Time , имеет такие методы, как plusDays(int), plusWeeks(int), plusMonths(int), которые должны помочь.

Предполагая, что вы хотите получить все даты от start до end в неделях (псевдокод):

DateTime start = // whatever
DateTime end = // whatever

List<DateTime> datesBetween = new ArrayList<DateTime>();

while (start <= end) {
   datesBetween.add(start);
   DateTime dateBetween = start.plusWeeks(1);
   start = dateBetween;
}
3 голосов
/ 14 октября 2011

Альтернативой Jado является использование стандартного Java API

Calendar start = // whatever
Calendar end = // whatever

List<Calendar> datesBetween = new ArrayList<Calendar>();

while (start.compareTo(end) <= 0) {
   datesBetween.add(start);
   Calendar dateBetween = start.add(Calendar.DAY_OF_MONTH, 7);
   start = dateBetween;
}
0 голосов
/ 16 июня 2016

java.time

Ответ Доналя с использованием Joda-Time правильный, но устаревший. Команда Joda-Time посоветовала нам перейти на инфраструктуру java.time, встроенную в Java 8 и более поздние версии. Большая часть функциональности java.time была перенесена на Java 6 & 7 и далее адаптирована для Android .

LocalDate

Для значения только для даты, без времени суток и без часового пояса, используйте класс LocalDate.

Half-Open

Обычно лучшая практика обработки промежутка времени называется Half-Open. В этом подходе начало диапазона составляет включительно , в то время как окончание исключительно . Таким образом, с примером кода ниже, вы увидите, что результаты не включают в себя stop дату. Если вы настаиваете на окончании включительно, измените date.isBefore ( stop ) на ! date.isAfter ( stop ).

Пример кода

В своем текущем состоянии Вопрос является расплывчатым, не затрагивая такие вопросы, как рассмотрение вопроса о том, совпадает ли дата начала с началом недели или началом месяца и т. Д. Другой вопрос: использовать ли Half-Open подход или нет. Таким образом, эти вопросы оставлены в качестве упражнения для читателя. ; -)

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

LocalDate start = LocalDate.of ( 2016 , Month.JANUARY , 2 );
LocalDate stop = start.plusDays ( 4 );
// LocalDate stop = start.plusWeeks ( 4 );

long days = ChronoUnit.DAYS.between ( start , stop );
List<LocalDate> dates = new ArrayList<> ();

if ( days == 0 ) {
    dates.add ( start );// Just one date, as start equals stop.

} else if ( days < 7 ) {  // Under a week, count day-by-day.
    LocalDate date = start;
    do {
        dates.add ( date );
        // Prep for next loop.
        date = date.plusDays ( 1 );
    } while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.

} else if ( days > 7 ) {  // Over a week, count week-by-week.
    LocalDate date = start;
    do {
        dates.add ( date );
        // Prep for next loop.
        date = date.plusWeeks ( 1 );
    } while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.

} else {
    // FIXME: ERROR. Should not be possible.
}

Дамп на консоль.

System.out.println ( "start: " + start + " | stop: " + stop + " | dates: " + dates );

При запуске со строкой для stop добавление 4 дней :

начало: 2016-01-02 | остановка: 2016-01-06 | даты: [2016-01-02, 2016-01-03, 2016-01-04, 2016-01-05]

При запуске со строкой stop добавление 4 недель :

начало: 2016-01-02 | остановка: 2016-01-30 | даты: [2016-01-02, 2016-01-09, 2016-01-16, 2016-01-23]

0 голосов
/ 15 июня 2016

Пример реализации Java с использованием jodatime для создания разбивки даты по большому диапазону с минимальным использованием памяти.

https://github.com/atulsm/Test_Projects/blob/master/src/DateSplitter.java

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