datepicker fecha fuera de un día

7 minutos de lectura

avatar de usuario de user823527
usuario823527

La fecha devuelta por el selector de fechas está errada por un día. ¿Es un problema en mi código o es un error?

La fecha de envío a date_picker es 2012-03-21. La fecha devuelta por datepicker es el martes 20 de marzo de 2012.

    var end_date = end_calendar.getFormatedDate("%Y-%m-%d");
    end_date = $.datepicker.formatDate('D M dd yy', new Date(end_date));

También tuve problemas con este problema y descubrí un punto destacado sobre el problema, así que pensé en agregar un fragmento de código que muestre el problema.

Solo el siguiente código:

  1. establece el valueAsDate propiedad
  2. lee el valueAsDate propiedad

Pero en mis sistemas siempre muestra una fecha incorrecta cuando leo la propiedad.

function initDate(){
document.querySelector("#mainDate").valueAsDate = new Date();
}
function showDate(){
    alert(document.querySelector("#mainDate").valueAsDate);
  }
<body onload="initDate()">
    <h2>Reading the property we set gets different value</h2>
    <p> Notice that the code only:
    <ul><li>sets the value using valueAsDate property</li>
    <li>reads the same property valueAsDate </li>
    </ul>
    <input type="date" id="mainDate">
    <button onclick="showDate()">show date</button>
  </body>

Aquí hay una instantánea del valor que obtengo que muestra que siempre obtengo una fecha que es un día menos que el valor que muestra el control.
El valor es un día menos que el que se muestra en el control

  • ¿Estás seguro de que esto está relacionado con el selector de fechas? document.write(new Date('2012-03-21')) huellas dactilares Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time) para mí. ¿Error de año bisiesto?

    –Wesley Murch

    1 de marzo de 2012 a las 1:32

  • También tiene algo que ver con el formato, mira esto: jsfiddle.net/fkSC5 Paso 2012-03-21 y 2012/03/21 a Date() da resultados con 4 horas de diferencia.

    –Wesley Murch

    1 de marzo de 2012 a las 1:38


  • Eso es cierto. new Date(‘…’) está desfasado un día.

    – usuario823527

    1 de marzo de 2012 a las 1:57

  • Lo que destaca que nunca debe confiar en el analizador de cadena de fecha incorporado. Difieren entre implementaciones, por lo que siempre analice la entrada y cree la fecha manualmente.

    – RobG

    1 de marzo de 2012 a las 2:37

  • Esto no es un error. Cuando proporciona la fecha en formato UTC estándar, Fecha asume que está proporcionando una hora UTC, que es independiente de su hora local. La razón por la que no está disponible durante el día es que la hora UTC corresponde a una zona horaria anterior a la suya. (Dado que tampoco proporcionó una hora, se asumió 0:0:0). Proporcionar una fecha en un formato que no sea UTC indica el uso de una zona horaria local. Me encontré con este problema en otro contexto, con YAML interpretando mi fecha de formato UTC con un día de diferencia.

    –Joe Lapp

    18 de febrero de 2016 a las 20:42


Avatar de usuario de Selvakumar Arumugam
Selvakumar Arumugam

No es el selector de fecha,

console.log(new Date('2012-03-21')); //prints Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time)

El JavaScript Fecha El objeto puede aceptar una de las siguientes sintaxis como se muestra a continuación,

  1. nueva fecha()
  2. nueva fecha (milisegundos)
  3. nueva fecha (cadena de fecha)
  4. nueva fecha (año, mes, día [, hour, minute, second, millisecond ])

Entonces, en su caso, llamará a dateString y analizar gramaticalmente. Así que intente agregar el tiempo como se muestra a continuación,

new Date ('2012-03-21T00:00:00') //should return you Wed Mar 21 2012

MANIFESTACIÓN

o Mejor usar como se muestra a continuación,

new Date (2012, 2, 21). 

año – Valor entero que representa el año. Por compatibilidad (para evitar el problema Y2K), siempre debe especificar el año completo; use 1998, en lugar de 98.

mes – Valor entero que representa el mes, comenzando con 0 para enero hasta 11 para diciembre.

día – Valor entero que representa el día del mes (1-31).

  • ¿Puedes arrojar algo de luz sobre mis comentarios anteriores? Por que new Date('2012-03-21) devolver una fecha que tiene 20:00:00 forma el tiempo y es el día equivocado, como dices en la primera línea de tu publicación?

    –Wesley Murch

    1 de marzo de 2012 a las 1:44


  • @Madmartigan Estoy tratando de entender lo mismo yo mismo. Parece que la nueva fecha (‘2012-03-21T00: 00: 00’) produce el mismo resultado que la nueva fecha (‘2012/03/21’). Sin embargo, no tengo ninguna explicación si uso/el tiempo predeterminado es 00:00:00

    – Selvakumar Arumugam

    1 de marzo de 2012 a las 1:52


  • new Date ('2012-03-21T00:00:00') devoluciones Tue Mar 20 2012 20:00:00 GMT-0400 (EDT)

    – Brian Riesgo

    19 de enero de 2016 a las 19:18

  • @SelvakumarArumugam Deberías actualizar tu respuesta. La línea new Date ('2012-03-21T00:00:00') hace NO producirá el 21 de marzo de 2012. Producirá el 20 de marzo de 2012.

    – AperioOculus

    21 de diciembre de 2016 a las 18:05

  • defectuoso ¿Es posible extraer una solicitud contra esto con una solución? Perdí un par de horas con esta tontería.

    – cero_cool

    24/04/2018 a las 20:05


avatar de usuario de user823527
usuario823527

Parece ser un error. Si la cadena enviada a Date() está formateado como 2012/03/21 en lugar de 2012-03-21. La fecha parece correcta.

  • Esto funciona, pero no tiene ningún sentido.

    – gmaníaco

    26 de mayo a las 15:15

Avatar de usuario de David
David

Esto no es un error, pero definitivamente confuso.

La mayoría de las respuestas en esta página son confusas y contienen información errónea.

El verdadero problema está en cómo el javascript Date objeto analiza cadenas de fecha.

La mejor respuesta que he encontrado es esta respuesta stack-O. Echa un vistazo a su excelente artículo.

A continuación hay un comentario muy pertinente de la respuesta mencionada anteriormente. (crédito: @Mizstik)

Todo esto se debe al comportamiento de Date.parse() subyacente que intenta seguir ISO 8601. Cuando la cadena de fecha sigue el formato aaaa-mm-dd, se supone que es ISO 8601 con UTC 00:00 implícito. Cuando la cadena se desvía del formato (por ejemplo, mm-dd-yyyy o barra oblicua en lugar de guión), recurre al analizador más flexible según RFC 2822, que usa la hora local cuando la zona horaria está ausente. Es cierto que todo esto será bastante arcano para una persona promedio.

Puede agregar la diferencia a la fecha que esencialmente ignorará la zona horaria.

d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

No sé por qué funciona esto, pero lo que he encontrado es que si usa barras o guiones, la respuesta se verá afectada. Echar un vistazo.

new Date ('2012/03/21'); // returns: "Wed Mar 21 2012 00:00:00 GMT-0500 (CDT)"
new Date ('2012-03-21'); // returns: "Tue Mar 20 2012 19:00:00 GMT-0500 (CDT)" WHA!

Entonces, para solucionar mi problema, hice una expresión regular simple en mi fecha de entrada para reemplazar siempre los primeros tres guiones con barras diagonales.

var strInputValue = control.value, // <-- get my date string
    dteCurrent;

strInputValue = strInputValue.replace(/-/, "https://stackoverflow.com/")  // replace 1st "-" with "https://stackoverflow.com/"
                             .replace(/-/, "https://stackoverflow.com/"); // replace 2nd "-" with "https://stackoverflow.com/"

dteCurrent = new Date(strInputValue);

hice un muy rápido busque en google por qué sucedería esto y no hay respuesta. Pero esto debería solucionar su problema. Todo lo que tiene que hacer es reemplazar los guiones con barras diagonales antes de pasarlos a donde los quiere.

Editar: lo siento, no noté la respuesta ya aceptada antes de publicar, ignore esta respuesta.

  • Uno de los comentarios de la pregunta explica correctamente por qué este es el caso. La diferencia de formato parece dictar Fecha para asumir algunos valores como cero en UTC, lo cual no es el caso cuando usa barras diagonales

    – fkl

    15 de noviembre de 2016 a las 7:46

avatar de usuario de user158
usuario158

Está sucediendo debido a la diferencia en la zona horaria con el formato de fecha: aaaa-mm-dd

new Date ('2015/07/10'); // returns: "Fri Jul 10 2015 00:00:00 GMT-0700 (Pacific Daylight Time)"

new Date ('2012-07-10'); // returns: "Thu Jul 09 2015 17:00:00 GMT-0700 (Pacific Daylight Time)" 

yyyy/mm/dd – no está considerando la zona horaria al calcular la hora local. Pero
yyyy-mm-dd – está considerando timezeone mientras calcula la hora local en la función de fecha del script java.
Esto puede ser reproducible cuando las zonas horarias del cliente (navegador) y del servidor son diferentes y tienen una diferencia de zona horaria/fecha de 1 día.

Puede probar esto en su máquina cambiando el tiempo a diferentes zonas horarias donde el intervalo de tiempo en blanco y negro debe ser> = 12 horas.

  • Uno de los comentarios de la pregunta explica correctamente por qué este es el caso. La diferencia de formato parece dictar Fecha para asumir algunos valores como cero en UTC, lo cual no es el caso cuando usa barras diagonales

    – fkl

    15 de noviembre de 2016 a las 7:46

Avatar de usuario de la comunidad
Comunidad

Después de probar muchas soluciones, me funcionó el siguiente código tomado de (https://stackoverflow.com/a/14006555/1736785)

   function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}

¿Ha sido útil esta solución?