Countdown muestra NaN : NaN : NaN : NaN
Resuelto
lina-24
Mensajes publicados
65
Estado
Miembro
-
lina-24 Mensajes publicados 65 Estado Miembro -
lina-24 Mensajes publicados 65 Estado Miembro -
Bonjour,
Vengo a ustedes para corregir un error en mi script.
Estoy utilizando un Countdown php mysql. Cuando una fecha y hora se registra en mi base de datos con un formato correcto, por ejemplo, (2021-09-09 11:11:00), funciona muy bien.
Sin embargo, cuando la fecha recuperada es NULL o 0000-00-00 00:00:00, me muestra NaN: NaN: NaN: NaN.
Me gustaría que cuando la fecha registrada en mi base de datos sea NULL o...(0000-00-00 00:00:00) no se muestre nada.
Por favor, ayúdenme a corregir este error.
Configuración: Windows / Chrome 94.0.4606.54
Vengo a ustedes para corregir un error en mi script.
Estoy utilizando un Countdown php mysql. Cuando una fecha y hora se registra en mi base de datos con un formato correcto, por ejemplo, (2021-09-09 11:11:00), funciona muy bien.
Sin embargo, cuando la fecha recuperada es NULL o 0000-00-00 00:00:00, me muestra NaN: NaN: NaN: NaN.
Me gustaría que cuando la fecha registrada en mi base de datos sea NULL o...(0000-00-00 00:00:00) no se muestre nada.
Por favor, ayúdenme a corregir este error.
<?php // La fecha para 'poll_end_date' $date = ($p->promo); // Analiza la cadena según el formato esperado $dtime = DateTime::createFromFormat("Y-m-d H:i:s", $date); // Salida de la fecha para que coincida con el formato requerido if ($dtime) { $timestamp = $dtime->format('F j, Y H:i'); } else { $timestamp = ""; } ?> <p class="countdown-timer" id="demo"></p>
// Establecer la fecha a la que estamos contando var countDownDate = new Date("<?php echo $timestamp; ?>").getTime(); // Actualizar la cuenta atrás cada segundo var x = setInterval(function(){ // Obtener la fecha y hora de hoy var now = new Date().getTime(); // Encontrar la distancia entre ahora y la fecha de cuenta atrás var distance = countDownDate - now; // Cálculos de tiempo para días, horas, minutos y segundos var days = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000); // Salida del resultado en un elemento con id="demo" if (countDownDate) { document.getElementById("demo").innerHTML = days + ": " + hours + " : " + minutes + ": " + seconds + " "; } // Si la cuenta atrás ha terminado, escribe algún texto if (distance < 0) { clearInterval(x); document.getElementById("demo").innerHTML = "EXPIRED"; } }, 1000); Configuración: Windows / Chrome 94.0.4606.54
10 respuestas
-
Hola,
Recupera el contenido de tu variable PHP en una variable JS y luego observa lo que contiene antes de intentar usarlo en el resto del código JS... (en otras palabras, divide la línea 3 de tu JS en dos... luego utiliza un IF en tu función)
--
.
Atentamente,
Jordane -
Je vous remercie pour votre réponse.
No soy buena en JS, he utilizado un if y aun así me muestra NaN: NaN: NaN más 0000-00-00 00:00:00
Por favor, ¿podrían arreglarme el código? Se los agradecería.<?php if(count($info) > 0){ ?> <?php echo $date = ($p->promo); // Analiza la cadena según el formato esperado $dtime = DateTime::createFromFormat("Y-m-d H:i:s", $date); // Salida de la fecha para que coincida con el formato requerido $timestamp = $dtime->format('F j, Y H:i'); ?> <p class="countdown-timer" id="demo"></p> <?php }else { ?> <em> Nada </em> <?php } ?> -
su respuesta es demasiado vaga para mí.
mi nivel en php y js es realmente muy modesto, señor, por eso solicito ayuda en los foros.
le agradezco por su atención. -
Coté php :
<?php $date = $p->promo; if ( !empty($date) && strtotime($date) != '0000-00-00') { // Parse the string based on the expected format $dtime = DateTime::createFromFormat("Y-m-d H:i:s", $date); // Output the date to match the required format $timestamp = $dtime->format('F j, Y H:i'); }else{ $timestamp = ""; }
Coté JS :
// Set the date we're counting down to var cdate = "<?php echo $timestamp; ?>"; if(cdate !=""){ var countDownDate = new Date(cdate).getTime(); // Update the count down every 1 second var x = setInterval(function(){ // Get today's date and time var now = new Date().getTime(); // Find the distance between now and the count down date var distance = countDownDate - now; // Time calculations for days, hours, minutes and seconds var days = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000); // Output the result in an element with id="demo" document.getElementById("demo").innerHTML = days + ": " + hours + " : " + minutes + ": " + seconds + " "; // If the count down is over, write some text if (distance < 0) { clearInterval(x); document.getElementById("demo").innerHTML = "EXPIRED"; } }, 1000); }
Bien sûr il y a d'autres façons de faire.
Vérifier, par exemple que ta variable days ne soit pas NaN en utilisant la fonction https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/isNaN
.
Cordialement,
Jordane -
Gracias por tu respuesta, aún no he solucionado el problema !!
Cuando recupero una fecha no válida de mi base de datos, por ejemplo, (0000-00-00 00:00:00), siempre me muestra NaN: NaN: NaN: NaN. Lo que quiero es que cuando la fecha sea (0000-00-00 00:00:00) no se muestre nada :( -
Ya probado y no funciona. Cuando recupero una fecha no válida de mi base de datos, por ejemplo, (0000-00-00 00:00:00), siempre me muestra NaN: NaN: NaN: NaN, pero cuando la fecha es válida, funciona.
$date = $p->promo; if ( !empty($date) && strtotime($date) != '0000-00-00 00:00:00') { // Analiza la cadena según el formato esperado $dtime = DateTime::createFromFormat("Y-m-d H:i:s", $date); // Salida de la fecha en el formato requerido $timestamp = $dtime->format('F j, Y H:i'); } else { $timestamp = ""; } -
Es asombroso, en Firefox funciona muy bien, acabo de descubrirlo. Vamos a abrir la consola, pero en Google Chrome no funciona.
-
He vaciado la caché y no funciona.
De hecho, el atributo datetime-local es bastante nuevo en la especificación HTML5 y la implementación varía de un navegador a otro.
Firefox es más permisivo para este escenario particular y muestra la fecha correctamente. Chrome sigue la especificación y no reconoce el formato de fecha "incorrecto". -
SOLUCIÓN PROPUESTA en otro foro
La solución es respetar la especificación w3c y utilizar la cadena literal « T » entre las partes de la fecha y la hora. Así
<input type="datetime-local" value="2018-02-25T19:24:23"/>
solo me queda encontrar un método para formatear la fecha
en el foro han propuesto el siguiente código, por mi parte no sé dónde colocarlo en mi código@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private Date createdAt;
-
Este input es del lado del administrador del dashboard del sitio. Cuando introduzco un nuevo artículo, debo llenar mis campos para guardarlos en mi base de datos.
El input de promoción, si lo dejo vacío, en mi base de datos me coloca automáticamente 0000-00-00 00:00:00.
En mi base de datos, el campo de promoción es de tipo (datetime). Tuve que cambiarlo a varchar null para no tener 0000-00-00 00:00:00, pero ahora el formato de mi fecha ha cambiado en mi base de datos y hay una "T" entre las partes de fecha y hora cuando selecciono una fecha. Además, es null si no selecciono la fecha de promoción.
Mi pregunta es cómo formatear una fecha de tipo yyyy-MM-dd'T'HH:mm:ss.
Les agradezco por su atención :)