hora - El getDate de JavaScript devuelve una fecha incorrecta
fechas en javascript (12)
La siguiente secuencia de comandos devuelve 20 en lugar de 21.
var d = new Date("2010/03/21");
document.write(d.getDate());
¿Qué estoy haciendo mal? ¿Es esto un error de JavaScript?
¿Hay alguna posibilidad de que trate el argumento de cadena como UTC y el objeto Date
resultante como hora local, o viceversa? Eso podría tirarlo. Compare d.getDate()
con d.getUTCDate()
.
Al dar una nueva fecha a una fecha de cadena, la cadena debe incluir la zona horaria, de lo contrario se interpretará de manera diferente de navegador a otro (debido a diferentes implementaciones de javascript) y de máquina a otra (debido a la diferencia de la zona horaria local)
new Date(''2017-07-31T10:00:00-0500'');
en lugar de
new Date(''2017-07-31T10:00:00'');
Asegúrese de que el número de mes que está usando es -1, si está mirando a junio, debe hacer (6-1) para el mes, cuando cree
var date_obj = new Date(y,(m-1),d);
El método Date.parse
depende de la implementación ( new Date(string)
es equivalente a Date.parse ).
Si bien este formato estará disponible en los navegadores modernos, no puede estar 100% seguro de que el navegador interpretará exactamente su formato deseado.
Te recomendaría manipular tu cadena y usar el constructor Fecha con los argumentos de año, mes y día:
// parse a date in yyyy-mm-dd format
function parseDate(input) {
var parts = input.match(/(/d+)/g);
// new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}
Es el huso horario el que juega un papel importante aquí. La función de Date()
agregará su zona horaria a la fecha que está dando como entrada.
Por ejemplo:
Di la entrada de esta manera:
alert(new Date("2018-09-15"));
El resultado para mí es
Sat Sep 15 2018 05:30:00 GMT+0530 (India Standard Time)
La zona horaria +0530
se agrega a mi entrada.
, obtuviste el resultado 20
porque estás en la zona horaria inferior a 0 ( -1è :
00`, etc ...)
La solución es restablecer tu zona horaria a 0 . Me gusta esto:
Date("2010-03-21T00:00:00").
Es un problema de horario de verano, porque Date () usa la hora local.
Vivo en Brasil y el 21 de octubre de 2012 es el comienzo del horario de verano en la mayor parte de mi país, por lo que las fechas locales en Oct-21-2012 entre 0: 0 y 1: 0 no existen en Brasil.
Algunas personas comentan aquí que funciona. Sucede porque el retorno de la hora correcta o incorrecta depende del país del usuario local.
Ver: http://www.timeanddate.com/news/time/brazil-dst-2012.html
En Brasil, en 2012, Java cree que el horario de verano comienza el 14 de octubre (en realidad comienza a partir de 1 semana).
var dt = new Date(2012,9,14);
alert(dt.getHours());
produce 1 y
Ver: http://www.timeanddate.com/time/dst/2013.html
La solución es usar el horario UTC (tiempo universal coordinado), porque no hay cambios en el horario de verano y se usa una especie de tiempo abstracto. En la mayoría de las aplicaciones prácticas no hay problema.
var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + ''/'' + dt.getUTCDate() + ''/'' +
dt.getUTCFullYear() + " " + dt.getUTCHours()+ '':'' +
dt.getUTCMinutes() + '':'' + dt.getUTCSeconds() );
es más fácil si alguien no usa horas, minutos y segundos, simplemente coloca un valor de hora ficticia mayor o igual a 1, como he mostrado arriba.
Escribí el siguiente código en la barra de direcciones de mi navegador y el resultado fue 21
javascript:alert(new Date("2010/03/21").getDate())
No existe un error de Javascript, ya que hay muchas implementaciones de Javascript, por lo que querrá consultar una implementación específica.
La implementación que probé fue Chrome 4.1.249. ¿Lo que es tuyo?
No puede crear el objeto Fecha al pasar el argumento de cadena muestra como fecha.
Crear como esta manera.
var str_date = "2010/03/21";
var date = new Date();
var date_elements = str_date.split("/");
date.setYear(date_elements[0]);
date.setMonth(date_elements[1]);
date.setDay(date_elements[2]);
alert(date.toString);
presta atención al método date.toString
. devuelve cadena de fecha completa. date.getDate
solo te dará el día de ese día.
para obtener más información sobre el objeto Date, consulte www.w3school.com
Obtengo la misma fecha (21) en firfox, safari, cromo, opera e IE, ya sea que use la cadena "2010/03/21" o los argumentos de fecha entera (2010,2,21).
Estoy usando una máquina de Windows y nuevas versiones de los navegadores-
puede probar para ver si su cliente analiza una fecha diferente de la cadena, que es el único lugar donde veo un problema.
if(new Date("2010/03/21")- new Date(2010,2,21)){
alert(new Date("2010/03/21"));
}
Probé este código en Firefox 3.6 e IE 8:
<script type="text/javascript">
var d = new Date("2010/03/21");
document.write(d.getDate());
</script>
Está mostrando la fecha correcta: 21
Para obtener más información, consulte: JavaScript Date Object
También puede leer sobre consideraciones de compatibilidad de JavaScript en Wikipedia.
También obtengo una desviación de un día a través de getDate()
, pero observo que getUTCDate()
devuelve el valor esperado. El problema se veía en FF 3.6.12, pero el mismo código que se ejecutaba en Chrome estaba bien.
Mi código de depuración:
var date="2010-11-04";
alert(date);
var d = new Date(date)
alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate());
Esto dio una salida (FireFox):
Miércoles, 03 de noviembre de 2010: 3 UTC 4
Chrome está bien. Así que algo está pasando en alguna parte, quizás un error, pero más probablemente sea un problema de zona horaria / UTC. Me recuerda dónde PHP date()
devolverá 23 horas en un día si la zona horaria cambió ese día, etc. Sin embargo, me equivoqué si sé lo que es.
http://jsbin.com/aqoki3/edit : aquí con el código que publicaste obtengo 21
. Entonces no es un error de JS. Tal vez es un error en la implementación de su navegador (de JS).
Para iniciar correctamente su fecha, utilice una new Date(year, month, date [, hour, minute, second, millisecond ])
( https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date ). De esta forma, estarás seguro de que ese día es 21 porque implícitamente lo configuraste en 21.