นากต้นฉบับวางแผ่นปฏิทินต่อกันจนถึงเส้นขอบปลายที่เว้นไว้บนโต๊ะมิ้นต์

Java LocalDate.datesUntil: เดินช่วงวันแบบไม่พลาดขอบเขตท้าย

พี่โชว์Engineering

การสร้างรายการวันด้วย loop มักมีคำถามเดิม: วันสิ้นสุดรวมไหม เพิ่มก่อนหรือหลัง และเดือนที่ยาวไม่เท่ากันทำอย่างไร LocalDate.datesUntil(endExclusive) คืน ordered Stream ตั้งแต่วันเริ่มจนก่อนวันสิ้นสุด จึงใช้กติกา half-open แบบเดียวกับ range ที่นักพัฒนาคุ้นเคย

import java.time.LocalDate;
import java.time.Period;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    var start = LocalDate.of(2026, 9, 28);
    var endExclusive = LocalDate.of(2026, 10, 2);
    List<LocalDate> days = start.datesUntil(endExclusive).toList();

    assert days.equals(List.of(
        LocalDate.of(2026, 9, 28),
        LocalDate.of(2026, 9, 29),
        LocalDate.of(2026, 9, 30),
        LocalDate.of(2026, 10, 1)));

    var everyTwoDays = start.datesUntil(endExclusive, Period.ofDays(2)).toList();
    assert everyTwoDays.size() == 2;
    System.out.println(days);
  }
}

เหมือนบัตรจองโรงแรม: check-in รวม แต่ check-out ไม่ใช่คืนที่พัก ถ้าธุรกิจต้องรวมวันสุดท้าย ให้ตั้งชื่อชัดแล้วส่ง lastDay.plusDays(1) หลังตรวจ overflow และความหมาย timezone

LocalDate ไม่มีเวลาและ zone เหมาะกับวันปฏิทิน หากโจทย์คือชั่วโมงจริงผ่าน DST ให้ใช้ชนิดเวลาและ zone ที่ตรงโดเมน อย่าแปลงวันเป็น 24 ชั่วโมงคงที่ ส่วน step ต้องไม่เป็นศูนย์และต้องเดินไปทิศของ end ไม่เช่นนั้น API จะปฏิเสธ

Recap

  • ตั้งชื่อตัวแปร endExclusive ให้ขอบเขตอ่านออก
  • ใช้ Period step เมื่อไม่ได้เดินวันละหนึ่ง
  • อย่าปน LocalDate กับ duration 24 ชั่วโมง
  • ทดสอบข้ามเดือน ปีอธิกสุรทิน และช่วงว่าง