2012-03-01 20 views
33

La fecha devuelta por el selector de fecha está desactivada por un día. ¿Es un problema en mi código o es un error?datepicker date off by one day

La fecha de envío de date_picker es 2012-03-21. La fecha devuelta por planificador de evento es Tue Mar 20 2012.

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

¿Seguro que esto está relacionado con el marcador de fecha? 'document.write (new Date ('2012-03-21'))' prints 'Mar 20 de feb. 20:00:00 GMT-0400 (Eastern Daylight Time)' para mí. ¿Error del año bisiesto? –

+0

Algo relacionado con el formateo también, mira esto: http://jsfiddle.net/fkSC5/ Al pasar '2012-03-21' y' 2012/03/21' a 'Date()' se obtienen resultados que son 4 horas de diferencia –

+0

Eso es verdad. nueva Fecha ('...') está desactivada por un día. – user823527

Respuesta

16

Parece ser un error. Si la cadena enviada a Date() tiene el formato 2012/03/21 en lugar de 2012-03-21. La fecha parece correcta.

+0

gracias @ user823527 – Sohail

0

comprobar la ortografía de .getFormatedDate y modificarlo para que .getFormattedDate es un cambio trivial, pero retocarlo y ver si alguno resultados del accesorio.

21

No es el selector de fechas,

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

El objeto Javascript Date puede aceptar una de las siguientes sintaxis como abajo,

  1. new Date()
  2. Fecha Nueva (milisegundos)
  3. nuevo Fecha (dateString)
  4. nuevo Fecha (año, mes, día [, hora, minuto, segundo d, milisegundo])

Por lo que en su caso va a llamar a dateString y parse. Así que trate añadiendo el tiempo como abajo,

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

DEMO

o mejor usar como abajo,

new Date (2012, 2, 21). 

años - Valor entero que representa el año. Por compatibilidad (para evitar el problema del año 2000), 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 a 11 para diciembre.

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

+1

¿Puedes arrojar algo de luz sobre mis comentarios de arriba? ¿Por qué 'nueva Fecha ('2012-03-21)' devuelve una fecha que tiene '20: 00: 00' hora del formulario y es el día incorrecto, como lo indica en la primera línea de su publicación? –

+2

@Madmartigan Estoy tratando de entender lo mismo. Parece que la nueva fecha ('2012-03-21T00: 00: 00') arroja el mismo resultado que una nueva fecha ('2012/03/21'). Sin embargo, no tengo ninguna explicación si usa el tiempo por defecto a 00:00:00 –

+0

, puede considerar http://stackoverflow.com/a/33494882/533426 – Toskan

11

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

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

gracias su respuesta ayuda aquí http://stackoverflow.com/questions/32469269/javascript-date-give-wrong-date-off-by-one -hora solo uso menos '-' y uso la hora actual para obtener una compensación de zona horaria como esta' d.setTime (d.getTime() - new Date(). getTimezoneOffset() * 60 * 1000); ' – Youssef

7

No sé por qué funciona, pero lo que he descubierto es si usa barras diagonales o rayas afecta la respuesta. 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! 

Así que para arreglar mi problema que hizo una expresión regular sencilla en mi fecha de entrada para reemplazar siempre los tres primeros guiones con barras diagonales.

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

strInputValue = strInputValue.replace(/-/, '/') // replace 1st "-" with "/" 
          .replace(/-/, '/'); // replace 2nd "-" with "/" 

dteCurrent = new Date(strInputValue); 

hice un muy rápido búsqueda en Google de por qué esto iba a pasar y no como respuesta. Pero esto debería solucionar tu problema. Todo lo que tienes que hacer es reemplazar los guiones con barras diagonales antes de pasarlos a donde quieras.

Editar: Lo siento, no me di cuenta de la respuesta ya aceptada antes de la publicación, por favor, ignore esta respuesta.

+0

One del comentario 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, que no es el caso cuando usa barras diagonales – fayyazkl

+0

, no funciona para mí. incluso si reemplazo - con /, la salida es la misma ... – amidstCloud

4

Está sucediendo debido a la diferencia en el huso horario con la fecha formato- 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á teniendo en cuenta al calcular la zona horaria local de tiempo.Pero
yyyy-mm-dd - está considerando el tiempo mientras que el cálculo locales hora en la función de fecha del script java.
Esto puede ser reproducible cuando el cliente (navegador) y las zonas horarias del servidor son diferentes y tienen una diferencia de zona horaria/fecha en 1 día.

Puede probar esto en su máquina cambiando la hora a diferentes zonas horarias donde el intervalo de tiempo b/w debería ser> = 12 horas.

0

No tengo la reputación para comentar, pero Venu M me dio una buena idea. Mi proyecto está teniendo el mismo problema en el que, dependiendo de la sintaxis de la entrada de mi fecha, la fecha vuelve como entrada o se desactiva un día. Ampliando y mirando el formato de fecha completa, mis diferentes formatos de fecha de entrada vuelven ya sea en UTC o en mi zona horaria local, dependiendo de la sintaxis. Estoy usando Moment JS para analizar mis fechas y luego devolver un objeto de fecha para la validación con Breeze. Tengo un modal de entrada o una tabla para editar, así que ahora necesito asegurarme de que ambos sean analizados y validados de manera idéntica. Sugiero que verifique que su objeto de fecha se esté creando de la misma manera, independientemente de su sintaxis de entrada o ubicación de entrada.

1
var myDate = $.datepicker.parseDate("yy-mm-dd", "2013-10-21"); 
..//do whatever with myDate now 
0

Después de experimentar el mismo problema y el aterrizaje en esta página, resultó en mi caso fue causado por el etiquetado no válido de los días. Empecé la semana el lunes, en lugar del domingo. Espero que esto ayude a alguien.

1

Después de probar muchas soluciones el siguiente código trabajado para mí 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())); 
} 
4

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

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

La mejor respuesta que he encontrado es this stack-O answer. Echa un vistazo a su 'excelente reseña.

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

Todo esto se debe al comportamiento de la Date.parse subyacente() tratando de seguir la norma ISO 8601. Cuando la cadena de fecha sigue el formato aaaa-mm-dd, se asume que ser ISO 8601 con UTC implícita 00:00. Cuando la cadena se desvía del formato (por ejemplo, mm-dd-aaaa o barra en lugar de guión), vuelve al analizador más flexible de acuerdo con 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.