Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

195
Vistas
Conversión de fecha que resulta en un problema de zona horaria

Estoy tratando de obtener funcionalidad: si la fecha ingresada por el usuario es menor que la fecha actual, necesito mostrar un mensaje de error en la pantalla, implementé el siguiente código que funciona bien en la fecha de mi sistema local pero no funciona en otras zonas horarias . ¿Alguien puede ayudar a conseguir esto?

Necesito usar solo javascript o jquery. Se suponía que no debía usar otras bibliotecas.

 dateFormat = function(value, event) { let newValue = value.replace(/[^0-9]/g, '').replace(/(\..*)\./g, '$1'); const dayOrMonth = (index) => index % 2 === 1 && index < 4; // on delete key. if (!event.data) { return value; } return newValue.split('').map((v, i) => dayOrMonth(i) ? v + '/' : v).join(''); } checkStart = function(value) { var newDate = new Date().toISOString(); var inputDate = new Date(value).toISOString(); var today = new Date(newDate).setHours(0,0,0,0); var userDate = new Date(inputDate).setHours(0,0,0,0); if(userDate < today) { $('#error-msg3').show(); $('#startDate').val(''); } else { $('#error-msg3').hide(); } }
 <input type="tel" maxlength="10" id="startDate" name="startDate" placeholder="mm/dd/yyyy" oninput="this.value = dateFormat(this.value, event)" onblur="checkStart(this.value)" required/> <span id="error">Start date should not be lesser than the current date.</span> <script src="https://code.jquery.com/jquery-3.6.0.js"></script>

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

El servidor y la base de datos pueden ejecutarse en una zona horaria diferente (se prefiere UTC) y cuando envía la fecha como una cadena, no tiene ninguna zona horaria allí, sino que es solo una cadena.

Intente enviarlo como una marca de tiempo o una cadena de fecha UTC para que el servidor y la base de datos lo conviertan automáticamente a su zona horaria y lo almacenen. y cuando cualquier usuario lo obtenga de otra zona horaria, se convertirá automáticamente a su zona horaria (pero almacena una cadena, solo se tratará como una cadena en todas partes)

 let d = new Date() console.log(d.getTime()) //or get utc string console.log(d.toUTCString())

Envía este valor a tu servidor (API)

about 4 years ago · Juan Pablo Isaza Denunciar

0

Su código se ejecuta completamente en el cliente, por lo que la zona horaria es irrelevante.

En el OP hay:

 var newDate = new Date().toISOString(); ... var today = new Date(newDate).setHours(0,0,0,0);

La conversión de Fecha a cadena a Fecha a número es ineficiente e innecesaria. Lo siguiente es equivalente:

 let today = new Date().setHours(0,0,0,0);

Del mismo modo para inputDate :

 var inputDate = new Date(value).toISOString(); ... var userDate = new Date(inputDate).setHours(0,0,0,0);

es equivalente a:

 let userDate = new Date(value).setHours(0,0,0,0);

Todos los cálculos son locales, por lo que la zona horaria es irrelevante. Consulte también ¿Por qué Date.parse da resultados incorrectos?

Intentar controlar la entrada del usuario mediante un script siempre es complicado, ya que hay muchos casos en los que es imposible o poco práctico codificar. El uso de una entrada de teléfono para Fechas es un ejemplo. Todo el problema se puede evitar utilizando una entrada de fecha y estableciendo un valor mínimo para hoy. Entonces los usuarios no pueden seleccionar una fecha anterior a hoy y su problema se resuelve, por ejemplo

 window.onload = function() { let dateEl = document.getElementById('dateInput'); dateEl.min = new Date().toLocaleString('en-CA', {year:'numeric', month:'2-digit', day:'2-digit'}); }
 <input id="dateInput" type="date">

Si está comparando la fecha enviada por el usuario con una fecha en el servidor, entonces la precisión del reloj del sistema del usuario y la zona horaria pueden ser un problema, pero eso no se explica en el OP.

Si eso es un problema, entonces debe hacer otra pregunta sobre ese tema específico.

Si realmente desea controlar manualmente la fecha de entrada y mostrar un mensaje de error cuando se seleccionan fechas no válidas, analice el valor de la entrada de fecha y compárelo con el inicio de hoy y continúe desde allí:

 // Parse YYYY-MM-DD as local function parseYMDLocal(s) { let [Y, M, D] = s.split(/\D/); return new Date(Y, M-1, D); } // Check if date in YYYY-MM-DD format is before today function isBeforeToday(d) { return parseYMDLocal(d) < new Date().setHours(0,0,0,0); } function checkValue() { let errEl = document.getElementById('errEl'); errEl.textContent = ''; console.log(typeof this.value); if (isBeforeToday(this.value)) { errEl.textContent = 'Date must be today or later'; } else { // do something else } } window.onload = function() { document.getElementById('dateInp').addEventListener('blur', checkValue, false); }
 #errEl {color: red}
 <input id="dateInp" type="date"><span id="errEl"></span>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda