本文介绍如何使用原生 javascript 实现表单中“创建日期”与“月份数”联动更新“到期日期”,支持自动处理月末边界(如1月31日+1个月→2月28/29日),并确保日期格式兼容 html5 `` 及后端 php/mysql 存储。
在构建任务管理、合同登记或工单系统等业务表单时,常需根据「创建日期」和用户输入的「月份数」自动推算「到期日期」。HTML 原生 要求值为 YYYY-MM-DD 格式,而 JavaScript 的 Date 对象直接加月可能引发日期溢出问题(例如 2025-01-31 加 1 个月会错误变为 2025-03-02)。以下方案提供健壮、无依赖的解决方案:
// 获取 DOM 元素
const dateCreated = document.getElementById("date-created");
const amtOfMonths = document.getElementById("amt-of-months");
const dueDateInput = document.getElementById("due-date");
// 监听两个输入字段的变化
dateCreated.addEventListener("change", updateDueDate);
amtOfMonths.addEventListener("change", updateDueDate);
function updateDueDate() {
// 确保两个字段均有有效值
if (!dateCreated.value || !amtOfMonths.value) {
dueDateInput.value = "";
return;
}
const dueDate = addMonths(dateCreated.value, parseInt(amtOfMonths.value, 10));
dueDateInput.value = formatDateForInput(dueDate); // 输出 YYYY-MM-DD
}
// 安全地为日期添加指定月数(自动处理月末天数变化)
function addMonths(dateString, months) {
const date = new Date(dateString);
const originalDay = date.getDate();
// 先加月数
date.setMonth(date.getMonth() + months);
// 若目标月份该日不存在(如1月31日→2月),则回退到最后一天
if (date.getDate() !== originalDay) {
date.setDate(0); // 设为上月最后一天
}
return
date;
}
// 将 Date 对象转为标准 HTML5 date 输入所需格式:YYYY-MM-DD
function formatDateForInput(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
}此方案零依赖、语义清晰、边界处理严谨,可直接集成至现有 HTML 表单,为后续 PHP 数据持久化提供干净、标准化的日期输入。