使用JavaScript设置datetime-local类型的html输入的值并不容易。
<标题>input.valueAsNumber h1> 面的命令不起作用,除非您恰好在UTC时区。valueAsNumber接受日期时间的数字表示,但它不会将UTC数字表示转换为本地时区。 <标题>input.valueAsDate h1> 面返回"Uncaught DOMException: Failed to set 'valueAsDate' property on 'HTMLInputElement ." 输入元素不支持日期值。<标题>input.value h1> 面返回"指定值"Thu Mar 30 2023 12:54:17 GMT+0000 (UTC)"不符合要求的格式。格式为"yyyy-MM-ddThh:mm"后跟可选的":ss"或":ss.SSS">标题>标题>标题>下面是最好的,因为没有库,没有解析,没有新的函数。(当然,如果你在很多地方使用它,你当然可以把它放在一个函数中。)
let newdt = new Date("Thu Mar 30 2023 12:54:17 GMT+0000 (UTC)");
document.getElementById("dateInput").valueAsNumber = (newdt.valueOf()-newdt.getTimezoneOffset()*60000);
我也发现这是JS功能中一个非常恼人的缺口。我希望Date.toISOString()中有一个选项来指定输出的时区,或者另一个方法来返回本地时区的ISO格式。
也可以作为设置INPUT的函数。value而不是INPUT。valueAsNumber(我这样做是为了用相同的代码处理所有输入):
function toISOLocal(adate) {
var localdt = new Date(adate - adate.getTimezoneOffset()*60000);
return localdt.toISOString().slice(0, -1);
}
newdt = new Date("Thu Mar 30 2023 12:54:17 GMT+0000 (UTC)");
document.getElementById("dateInput").value = toISOLocal(newdt);
let date = new Date("Thu Mar 30 2023 12:54:17 GMT+0000 (UTC)");
const formatDate = (date) => {
return date.getFullYear() + "-" + (date.getMonth()+1).toString().padStart(2, '0') + "-" + date.getDate() + "T" + date.getHours().toString().padStart(2, '0') + ":" + date.getMinutes().toString().padStart(2, '0');
}
document.getElementById("dateInput").value = formatDate(date);
下面是如何完成的。我把这个问题/答案贴出来是为了避免别人得到这个解决方案的麻烦。
如果要使用Date.prototype的输出。toString,那么您应该解析该字符串并创建适合您的目的的时间戳。只需要将月份名称转换为数字,其余需要的内容都在字符串中,无需修改。
参见Date. toisostring(),但要使用本地时间而不是UTC直接使用Date对象。
下面是解析Date.prototype输出的示例。toString并重新格式化。/* Reformat timestamp in Date#toString format to ISO 8601 local
* i.e. without offset.
*
* @param {string} s - timestamp in ddd MMM DD YYYY HH:mm:ss format
* default is current date
* @returns {string} timestamp reformatted as YYYY-MM-DDTHH:mm:ss
*/
function reformatDateAsISO(s = new Date().toString()) {
let pad = n => (n < 10? '0':'') + n;
let months = [,'Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Non','Dec'];
let [day, mon, date, year, time, rest] = s.split(' ');
return `${year}-${pad(months.indexOf(mon))}-${date}T${time}`;
}
["Thu Mar 30 2023 12:54:17 GMT+0000 (UTC)",
new Date().toString()
].forEach(s => console.log(s + 'n' + reformatDateAsISO(s)));