# Java – 日期流

> 原文： [https://howtodoinjava.com/java9/stream-dates-datesuntil/](https://howtodoinjava.com/java9/stream-dates-datesuntil/)

对于 Java 开发人员而言，日期和时间处理一直是一个痛苦的领域。 Java 8 中添加的[新的 Date-Time API ](//howtodoinjava.com/java8/date-and-time-api-changes-in-java-8-lambda/)更改了在 Java 中与日期进行交互的方式。 这是一项非常强大且急需的改进。 唯一缺少的是获得日期的[流](//howtodoinjava.com/java8/java-8-tutorial-streams-by-examples/)，在两个后续日期之间存在一些共同的[差异](//howtodoinjava.com/java8/calculate-difference-between-two-dates-in-java/)（尽管有可能，但没有简便的方法）。

Java 9 引入了一种新方法[`LocalDate.datesUntil()`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html)，该方法可以提供日期流。 使用`datesUntil()`可以轻松创建具有固定偏移量的日期流。

## 1\. `LocalDate.datesUntil()`的语法

此方法有两种重载形式：

```java
Stream<LocalDate> datesUntil(LocalDate end)
Stream<LocalDate> datesUntil(LocalDate end, Period step)
```

第一个版本（即不带`Period`）内部调用带有`Period.ofDays(1)`的第二个方法，并生成日期流，两者之间相差 1 天。

## 使用`LocalDate.datesUntil()`的日期流示例

创建日期流非常简单明了。

```java
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
import java.util.stream.Collectors;

public class Java9StreamExamples {

    public static void main(String[] args) {
        System.out.println( getDaysInJava9(LocalDate.now(), LocalDate.now().plusDays(10)) );
        System.out.println( getDaysInJava9Weeks(LocalDate.now(), LocalDate.now().plusWeeks(10)) );
    }

    //Stream of dates with 1 day difference
    public static List<LocalDate> getDaysInJava9(LocalDate start, LocalDate end) {
        return start.datesUntil(end).collect(Collectors.toList());
    }

    //Stream of dates with 1 week difference
    public static List<LocalDate> getDaysInJava9Weeks(LocalDate start, LocalDate end) {
        return start.datesUntil(end, Period.ofWeeks(1)).collect(Collectors.toList());
    }
}

Output:

[2017-07-31, 2017-08-01, 2017-08-02, 2017-08-03, 2017-08-04, 
2017-08-05, 2017-08-06, 2017-08-07, 2017-08-08, 2017-08-09]

[2017-07-31, 2017-08-07, 2017-08-14, 2017-08-21, 2017-08-28, 
2017-09-04, 2017-09-11, 2017-09-18, 2017-09-25, 2017-10-02]

```

## 2\. Java 8 中的日期流

如果您仍未使用 Java 9，则可以使用以下给定的方法生成 Date 流。 该代码与 [Java 8](//howtodoinjava.com/java-8-tutorial/) 兼容。

```java
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Java9StreamExamples {

    public static void main(String[] args) 
    {
        System.out.println( getDaysInJava8(LocalDate.now(), 10) );
    }

    //Stream of dates with 1 day difference
    public static List<LocalDate> getDaysInJava8(LocalDate start, int days) 
    {
        return Stream.iterate(start, date -> date.plusDays(1))
                .limit(days)
                .collect(Collectors.toList());
    }
}

Output:

[2017-07-31, 2017-08-01, 2017-08-02, 2017-08-03, 2017-08-04, 
2017-08-05, 2017-08-06, 2017-08-07, 2017-08-08, 2017-08-09]

```

将我的问题放在评论部分。

学习愉快！