Java – 日期流

Java – 日期流

原文: https://howtodoinjava.com/java9/stream-dates-datesuntil/

对于 Java 开发人员而言,日期和时间处理一直是一个痛苦的领域。 Java 8 中添加的新的 Date-Time API 更改了在 Java 中与日期进行交互的方式。 这是一项非常强大且急需的改进。 唯一缺少的是获得日期的,在两个后续日期之间存在一些共同的差异(尽管有可能,但没有简便的方法)。

Java 9 引入了一种新方法LocalDate.datesUntil(),该方法可以提供日期流。 使用datesUntil()可以轻松创建具有固定偏移量的日期流。

1. LocalDate.datesUntil()的语法

此方法有两种重载形式:

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

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

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

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

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 兼容。

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]

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

学习愉快!