Java Joda Time — реализовать итератор диапазона дат

Я безуспешно пытаюсь внедрить итератор даты со временем Joda.
Мне нужно что-то, что позволит мне перебирать все дни от startDate до endDate
У вас есть идеи, как это сделать?


person mickthompson    schedule 23.07.2009    source источник
comment
Это помощь вообще? stackoverflow.com/questions/847520/   -  person Davis    schedule 24.07.2009
comment
Если вам нужны дни, вы хотите посмотреть на класс LocalDate (установить один в качестве даты начала) и сделать плюс дней для каждого следующего. Это позволит избежать проблем с часовым поясом, присущих Instant.   -  person Yishai    schedule 24.07.2009


Ответы (3)


Вот кое-что, чтобы вы начали. Вы можете подумать о том, хотите ли вы, чтобы он был инклюзивным или эксклюзивным в конце и т. д.

import org.joda.time.*;
import java.util.*;

class LocalDateRange implements Iterable<LocalDate>
{
    private final LocalDate start;
    private final LocalDate end;

    public LocalDateRange(LocalDate start,
                          LocalDate end)
    {
        this.start = start;
        this.end = end;
    }

    public Iterator<LocalDate> iterator()
    {
        return new LocalDateRangeIterator(start, end);
    }

    private static class LocalDateRangeIterator implements Iterator<LocalDate>
    {
        private LocalDate current;
        private final LocalDate end;

        private LocalDateRangeIterator(LocalDate start,
                                       LocalDate end)
        {
            this.current = start;
            this.end = end;
        }

        public boolean hasNext()
        {
            return current != null;
        }

        public LocalDate next()
        {
            if (current == null)
            {
                throw new NoSuchElementException();
            }
            LocalDate ret = current;
            current = current.plusDays(1);
            if (current.compareTo(end) > 0)
            {
                current = null;
            }
            return ret;
        }

        public void remove()
        {
            throw new UnsupportedOperationException();
        }
    }
}

class Test
{
    public static void main(String args[])
    {
        LocalDate start = new LocalDate(2009, 7, 20);
        LocalDate end = new LocalDate(2009, 8, 3);
        for (LocalDate date : new LocalDateRange(start, end))
        {
            System.out.println(date);
        }
    }
}

Я давно не писал итератор на Java, так что надеюсь он правильный. Я думаю, что это вполне нормально...

О блоках итераторов С#, это все, что я могу сказать...

person Jon Skeet    schedule 23.07.2009
comment
Спасибо, это просто сделало мою жизнь как минимум на 900% проще. - person Lotus Notes; 30.06.2010
comment
Я гуглил, есть ли у Джоды что-то для представления диапазона дат... Видимо, нет, поскольку вы предлагаете написать свой собственный LocalDateRange. - person Jonik; 27.04.2012
comment
@Jonik Joda предлагает интерфейс Interval и различные его реализации. Однако мне не удалось найти реализацию Iterable: может быть, более сложную... - person Stephan; 22.05.2014

http://code.google.com/p/google-rfc-2445 ?

person Den Orlov    schedule 24.06.2010

Я знаю, что вы спрашивали о Joda-Time. Сегодня мы должны предпочесть использовать java.time, современный API даты и времени Java, который в основном является дальнейшим развитием Joda-Time. Начиная с Java 9 итерация диапазона дат была встроена через Stream:

    LocalDate startDate = LocalDate.of(2019, Month.AUGUST, 28);
    LocalDate endate = LocalDate.of(2019, Month.SEPTEMBER, 3);
    startDate.datesUntil(endate).forEach(System.out::println);

Вывод:

2019-08-28
2019-08-29
2019-08-30
2019-08-31
2019-09-01
2019-09-02

Если вы хотите, чтобы дата окончания была включительной, используйте datesUntil(endate.plusDays(1)).

И если вы буквально хотели Iterator:

    Iterator<LocalDate> ldi = startDate.datesUntil(endate).iterator();

На домашней странице Joda-Time говорится:

Обратите внимание, что Joda-Time считается в значительной степени «законченным» проектом. Серьезных доработок не планируется. Если вы используете Java SE 8, перейдите на java.time (JSR-310).

(Joda-Time – Главная)

person Ole V.V.    schedule 04.09.2019