Java LocalDate.datesUntil: เดินช่วงวันแบบไม่พลาดขอบเขตท้าย
การสร้างรายการวันด้วย 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 ชั่วโมง
- ทดสอบข้ามเดือน ปีอธิกสุรทิน และช่วงว่าง