簡體   English   中英

Java Joda Time - 實現Date范圍迭代器

[英]Java Joda Time - Implement a Date range iterator

我試圖用Joda時間實現一個沒有成功的Date迭代器。
我需要一些東西,允許我從startDate到endDate的所有日子迭代
你對如何做到這一點有任何想法嗎?

這是讓你入門的東西。 您可能想要考慮是否希望它最終具有包容性或排他性等。

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編寫了一個迭代器已經有一段時間了,所以我希望它是正確的。 我覺得這很好......

哦,對於C#迭代器塊,我只能這樣說......

我知道你問過Joda-Time。 今天我們應該更喜歡使用java.time,它是現代Java日期和時間API,基本上是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 - Home

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM