import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;

public class PenyesuaiTemporal {
    public static void main(String[] args) {
        LocalDate hariIni = LocalDate.of(2026, 1, 15); // Kamis

        System.out.println("firstDayOfMonth     : " + hariIni.with(TemporalAdjusters.firstDayOfMonth()));
        System.out.println("lastDayOfMonth      : " + hariIni.with(TemporalAdjusters.lastDayOfMonth()));
        System.out.println("firstDayOfNextMonth : " + hariIni.with(TemporalAdjusters.firstDayOfNextMonth()));
        System.out.println("lastDayOfYear       : " + hariIni.with(TemporalAdjusters.lastDayOfYear()));
        System.out.println("next SUNDAY         : " + hariIni.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));
        System.out.println("nextOrSame THURSDAY : " + hariIni.with(TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY)));
        System.out.println("Minggu ke-3 Januari : " + hariIni.with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.SUNDAY)));

        // Pengukuran jarak dengan ChronoUnit.
        LocalDate target = LocalDate.of(2026, 3, 20);
        System.out.println("jarak DAYS          : " + hariIni.until(target, ChronoUnit.DAYS));
        System.out.println("jarak WEEKS         : " + hariIni.until(target, ChronoUnit.WEEKS));

        // Rangkaian konversi: tanggal -> tanggal-waktu -> berzona.
        LocalDateTime rapat = hariIni.atTime(9, 0);
        System.out.println("atTime + atZone     : " + rapat.atZone(ZoneId.of("Asia/Jakarta")));
    }
}
