Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách lấy ngày dùng LocalDate.datesUntil() trong Java 9

LocalDate.datesUntil() tạo Stream<LocalDate> giữa 2 LocalDate, có thể chỉ định step size. 2 overload:

  • datesUntil(LocalDate end): Stream ngày từ date này đến endDate (exclusive).
  • datesUntil(LocalDate end, Period step): Step nhảy (VD: 1 tháng, 1 tuần...).

Cú pháp

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

Ví dụ

import java.time.LocalDate;
import java.time.Period;
import java.time.Month;
import java.util.stream.Stream;

public class DatesUntilMethodTest {
    public static void main(String args[]) {
        final LocalDate myBirthday = LocalDate.of(1980, Month.AUGUST, 8);
        final LocalDate christmas = LocalDate.of(1980, Month.DECEMBER, 25);
        
        System.out.println("Day-Stream:\n");
        final Stream<LocalDate> daysUntil = myBirthday.datesUntil(christmas);
        daysUntil.skip(50).limit(10).forEach(System.out::println);
        
        System.out.println("\nMonth-Stream:\n");
        Stream<LocalDate> monthsUntil = myBirthday.datesUntil(christmas, Period.ofMonths(1));
        monthsUntil.limit(5).forEach(System.out::println);
    }
}

Kết quả

Day-Stream:
1980-09-27
1980-09-28
1980-09-29
1980-09-30
1980-10-01
1980-10-02
1980-10-03
1980-10-04
1980-10-05
1980-10-06

Month-Stream:
1980-08-08
1980-09-08
1980-10-08
1980-11-08
1980-12-08

Giải thích

  • Day-Stream: Tất cả ngày từ 8/8 đến 25/12 (exclusive). skip(50) bỏ 50 ngày đầu, limit(10) lấy 10 ngày tiếp.
  • Month-Stream: Step = 1 tháng (Period.ofMonths(1)). Lấy 5 tháng đầu: 8/8, 9/8, 10/8, 11/8, 12/8.

Ứng dụng thực tế

  • Tạo lịch sự kiện định kỳ (meeting hàng tuần, billing hàng tháng).
  • Generate date range cho report, chart.
  • Business day calculation (kết hợp filter skip weekend).
  • Test data generation cho date-sensitive logic.

Ví dụ: Business days (bỏ weekend)

LocalDate start = LocalDate.of(2024, 1, 1);
LocalDate end = LocalDate.of(2024, 1, 31);

List<LocalDate> businessDays = start.datesUntil(end)
    .filter(d -> d.getDayOfWeek().getValue() < 6) // Mon-Fri
    .collect(Collectors.toList());

datesUntil() làm cho date range generation trở nên declarative, functional, composable với Stream API.