Countdown muestra NaN : NaN : NaN : NaN

Resuelto
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.

 <?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

  1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
     
    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
    0
  2. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    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 } ?> 
    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       
      Nada que ver con JavaScript, aquí has hecho un if en PHP...
      En resumen, no has tenido en cuenta mi respuesta anterior.
      0
  3. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    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.
    0
  4. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
     
    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
    0
  5. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    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 :(
    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       
      Ah .. es un Dat'eTime, no solo una fecha ..
      solo necesitas modificar el IF en PHP para adaptarlo a este formato ..
      0
  6. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    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 = ""; } 
    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       
      Je suis désolé, mais je ne peux pas exécuter ou afficher de code ou de commandes.
      0
  7. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    Es asombroso, en Firefox funciona muy bien, acabo de descubrirlo. Vamos a abrir la consola, pero en Google Chrome no funciona.
    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       
      Es necesario que vacíes la caché de tu navegador....
      Tu JavaScript no debió tener en cuenta las modificaciones que hiciste.
      0
  8. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    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".
    0
  9. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    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; 
    0
    1. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 831
       
      Como no sé de dónde proviene esta entrada y no veo la conexión con el código que has dado, no podría responderte.
      0
  10. lina-24 Mensajes publicados 65 Estado Miembro 4
     
    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 :)
    0