如何从datetime-local字符串构造当日同时间的兼容格式日期串
问题:构造符合datetime-local格式的当日同时间字符串
我有一个包含<input type="datetime-local">的HTML页面,该输入框已有值。我需要构造一个符合datetime-local格式的新日期时间字符串,代表当日的同一时间。比如输入框当前值为'2022-12-01T12:00',当前日期是12月8日时,期望结果为'2022-12-08T12:00'。
我的初始实现如下:
const inpValue = '2022-12-01T12:00' const now = new Date const newDate = new Date(inpValue) // Thu Dec 01 2022 12:00:00 GMT-0700 (Mountain Standard Time) newDate.setDate(now.getDate()) // Thu Dec 08 2022 12:00:00 GMT-0700 (Mountain Standard Time) // 这个格式不被datetime-local接受 newDate.toISOString() // "2022-12-08T19:00:00.000Z" // 直接截取字符串会得到错误的本地时间 newDate.toISOString().substr(0,16) // "2022-12-08T19:00"
但这种方式得到的toISOString()格式不被datetime-local接受,直接截取字符串还会得到错误的本地时间。
解决方案
问题核心是toISOString()输出的是UTC时间,而datetime-local要求的是本地时间的YYYY-MM-DDTHH:mm格式。以下是几种可行的处理方式:
方法1:手动拼接本地时间各部分
直接从修改后的日期对象中提取本地时间的年、月、日、时、分,补零后拼接成目标格式:
const inpValue = '2022-12-01T12:00'; const now = new Date(); const newDate = new Date(inpValue); newDate.setDate(now.getDate()); // 提取各部分并补零 const year = newDate.getFullYear(); const month = String(newDate.getMonth() + 1).padStart(2, '0'); // 月份从0开始计数 const day = String(newDate.getDate()).padStart(2, '0'); const hours = String(newDate.getHours()).padStart(2, '0'); const minutes = String(newDate.getMinutes()).padStart(2, '0'); const formattedDateTime = `${year}-${month}-${day}T${hours}:${minutes}`; // 结果:"2022-12-08T12:00"
方法2:用Intl.DateTimeFormat格式化
借助国际化API分别生成日期和时间部分,再拼接成目标格式:
const inpValue = '2022-12-01T12:00'; const now = new Date(); const newDate = new Date(inpValue); newDate.setDate(now.getDate()); // 格式化日期和时间 const datePart = new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit' }).format(newDate); const timePart = new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit', hour12: false }).format(newDate); const formattedDateTime = `${datePart}T${timePart}`; // 结果:"2022-12-08T12:00"
方法3:调整时区偏移后截取(不推荐但可行)
如果想用toISOString(),可以先把本地时间转换为对应的UTC时间,再截取前16位:
const inpValue = '2022-12-01T12:00'; const now = new Date(); const newDate = new Date(inpValue); newDate.setDate(now.getDate()); // 减去时区偏移量,将本地时间转为对应UTC时间 const offsetMs = newDate.getTimezoneOffset() * 60 * 1000; const adjustedDate = new Date(newDate.getTime() - offsetMs); const formattedDateTime = adjustedDate.toISOString().slice(0, 16); // 结果:"2022-12-08T12:00"
内容的提问来源于stack exchange,提问作者Phrogz
相关产品推荐
相关产品推荐

