Tratando de limitar la fecha de inicio como mañana (fecha local). ¿Alguien puede decir por qué el siguiente código no funciona?
<form method="POST"> <div> <label for="s2">pickup_date</label> <input type = 'date' name='pickup_date' required> <br /><br /> </div> </form> <script> var time = new Date(); var localTimeStr = time.toLocaleString('en-US', { timeZone: 'Asia/Shanghai' }); today = new Date(localTimeStr) tomorrow = new Date(today.setDate(today.getDate() + 1)).toISOString().split('T')[0]; t = String(tomorrow) document.getElementsByName("pickup_date")[0].setAttribute('min', t); </script>la salida del siguiente código es 2022-01-18:
var time = new Date(); var localTimeStr = time.toLocaleString('en-US', { timeZone: 'Asia/Shanghai' }); today = new Date(localTimeStr) tomorrow = new Date(today.setDate(today.getDate() + 1)).toISOString().split('T')[0]; t = tomorrow.split('-')[0]+'-'+tomorrow.split('-')[1]+'-'+tomorrow.split('-')[2] console.log(t)sin embargo, la fecha de inicio del calendario en el formulario sigue siendo 2022-01-17. Pero, cuando configuro manualmente
document.getElementsByName("pickup_date")[0].setAttribute('min', '2022-01-18');el calendario comienza desde 2022-01-18 correctamente. ¡por qué!
En el OP hay:
var time = new Date(); var localTimeStr = time.toLocaleString('en-US', { timeZone: 'Asia/Shanghai' }); today = new Date(localTimeStr)Eso devolverá una marca de tiempo con la fecha y la hora de Shanghái.
tomorrow = new Date(today.setDate(today.getDate() + 1)).toISOString().split('T')[0];Eso primero analizará la cadena asignada a hoy como "local" para el sistema host utilizando el analizador incorporado, lo cual ECMA-262 no requiere (ver ¿Por qué Date.parse da resultados incorrectos? ).
Luego devolverá una cadena con formato ISO 8601 para la fecha y hora UTC equivalentes. Si el desplazamiento del sistema host es positivo, dependiendo de la hora en la marca de tiempo, la fecha será el mismo día o el día anterior. De manera similar, para los hosts con un desplazamiento negativo, la fecha puede ser el mismo día o el día siguiente, según la hora en la cadena y el desplazamiento del sistema host.
Hay muchas preguntas sobre el formato de las fechas, los diversos métodos toLocaleString son útiles, pero no sé qué tan confiables son a largo plazo. Para obtener una fecha local con formato ISO 8601, el formato asociado con el idioma en-CA parece adecuado:
new Date().toLocaleDateString('en-CA')Si desea obtener marcas de tiempo para la fecha actual y mañana en Shanghái en formato AAAA-MM-DD, considere:
let d = new Date(); let today = d.toLocaleDateString('en-CA', {timeZone:'Asia/Shanghai'}); d.setDate(d.getDate() + 1); let tomorrow = d.toLocaleDateString('en-CA', {timeZone:'Asia/Shanghai'}); console.log(`Today : ${today}\nTomorrow: ${tomorrow}`);