2011-05-31 18 views
7

estoy usando este script se encuentra aquí: http://www.javascriptkit.com/script/script2/dyndateselector.shtmlJavascript getDay devolver valores incorrectos para abril, junio, septiembre, noviembre

Si lo intenta, e ir a cualquiera de Abril, Junio, Septiembre o noviembre, se le observe que las columnas del día de la semana son incorrectas. He aquí una lista de datos incorrectos (la x se inicia y la materia está mostrando el mes siguiente.)

meses Fastidiado: 4/Abril (comienza el domingo en vez del viernes) mayo comienza el domingo

6/Junio ​​(aperturas Viernes en lugar del miércoles) julio comienza el viernes

9/septiembre (comienza el sábado en lugar del jueves) comienza el sábado

octubre

11/noviembre (comienza el jueves en lugar del martes) Dici mber starts Thursday

Notarás que cada mes con errores comienza el día del mes siguiente, sin embargo, todos los demás meses parecen ser correctos.

No encuentro nada sobre este problema. ¿Alguien capaz de ayudar? El Javascript real solo se puede encontrar aquí, y el método getDay() ocurre en la línea 125: http://pastebin.com/0zuBYrzv

He probado tanto en Firefox como en Chrome.

Aquí hay un código muy simple para demostrar el problema:

<script> 
var d = new Date(); 
d.setMonth(5); 
d.setFullYear(2011); 
d.setDate(1); 
alert(d.getDay()); 
</script> 

Esto creará una alerta con el mensaje "5", es decir, viernes (5 + 1 = 6, el viernes es el sexto día de la semana ,) cuando de hecho el miércoles es el comienzo de la semana.

+0

Tenga en cuenta que cuando uso 4/abril, se tiene en cuenta, y si Ctrl + F el script verá (m - 1), entonces se cambia a 3. –

Respuesta

8

Esto es realmente muy interesante, ya que supongo que mañana su código original funcionará como se desea de nuevo.

Lo que creo que está sucediendo es que está creando un nuevo Date y que se inicializará automáticamente hasta hoy (31 de mayo). Luego estableces el mes en junio, en el que básicamente dices que es el 31 de junio. Esta fecha no existe, por lo que javascript la convertirá en 1 de julio. Finalmente, configura la fecha, pero como su mes ya no es lo que quiere que sea, los resultados serán incorrectos.

+0

¡Oh, lo entiendo! Esto se verifica que si configuro día, mes, año, funciona correctamente. –

4

Parece que 0 es enero y 11 es diciembre.

+0

Eso es porque el mes y día de Javascript es basado en cero, no basado en una sola. –

1

Aparentemente a JavaScript no le gusta si configuro el mes, el año completo y el día. Lo que tengo que hacer todos ellos se encuentra en una de las funciones, así:

<script> 
var d = new Date(); 
d.setFullYear(2011, 5, 1); 
alert(d.getDay()); 
</script> 
+1

Estoy pensando que esto tiene que ver con cómo el setter funciona para la propiedad 'date' de un objeto' Date'. Parece que la versión de 3 argumentos de 'setFullYear' tiene en cuenta todas las fechas que deben modificarse, pero' setDate' no. Muy interesante. – Pat

+0

setFullYear los establece en el orden correcto: día, mes, año; año, día, mes; mes día año; o día, año, mes. –

0

Creo que esto es un error en el objeto de fecha de Javascript. Por favor, eche un vistazo al siguiente código. (Estoy usando w3school's JSref tool en línea para verlo rápidamente.) Tenga en cuenta que las formas utilizadas a continuación se cuentan por w3 schools themselves.

Algunos ejemplos de crear instancias de una fecha:

var hoy = new Date()
var d1 = new Date ("13 de octubre de, 1975 11:13:00")
var d2 = new fecha (79,5,24) (// esto está mal - resultados inesperados !!!)
var d3 = new Date (79,5,24,11,33,0)

Así tenga cuidado al usar este objeto Date, parece li ke ciertas formas de instanciar fechas son mejores que otras.

<script type="text/javascript"> 

function whatDayIsToday(date) 
{ 
var weekday=new Array(7); 
weekday[0]="Sunday"; 
weekday[1]="Monday"; 
weekday[2]="Tuesday"; 
weekday[3]="Wednesday"; 
weekday[4]="Thursday"; 
weekday[5]="Friday"; 
weekday[6]="Saturday"; 

document.write("Today is " + weekday[date.getDay()] + ", <br />"); 
document.write("the " + date.getDay() + getSuffix(date.getDay()) + " day of the week. <br /><br />") 
} 
function getSuffix(num) 
{ 
return (num>3)?"th":(num==3)?"rd":(num==2)?"nd":(num==1)?"st":""; 
} 

//CORRECT 
var d3 = new Date("01/01/2011"); 
whatDayIsToday(d3); 

//CORRECT 
var d2 = new Date("01/01/2011"); 
whatDayIsToday(d2); 

//DOESN'T WORK 
var d5 = new Date("1-1-2011"); 
whatDayIsToday(d5); 

//WRONG 
var d4 = new Date("2011", "01", "01"); 
whatDayIsToday(d4); 

//DAY OF WEEK IS WRONG 
var d = new Date(2011, 1, 1); 
whatDayIsToday(d); 

//DAY OF WEEK IS ALSO WRONG 
var d0 = new Date(11, 1, 1); 
whatDayIsToday(d0); 

</script> 

salidas (todas ellas con algún formato de 1/1/2011) son:

 
Today is Saturday, 
the 6th day of the week. (CORRECT, January first this year was a saturday) 

Today is Saturday, 
the 6nd day of the week. (CORRECT) 

Today is undefined, 
the NaNnd day of the week. (WRONG FORMATTING, DOESN'T WORK - EXPECTED) 

Today is Tuesday, 
the 2nd day of the week. (WRONG - UNEXPECTED) 

Today is Tuesday, 
the 2nd day of the week. (WRONG - UNEXPECTED) 

Today is Wednesday, 
the 3nd day of the week. (WRONG - UNEXPECTED) 

Sobre la base de las otras respuestas a esta pregunta, supongo que tiene que ver con el día en que estoy actualmente (26/8/2011) - esta sería mi partida nueva Fecha() y los días y/o años se aplicarán en el orden incorrecto. Sin embargo, seguro sería bueno if this thing worked!

-1

Este es el enfoque equivocado típica:

var days = ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"]; 
var d = new Date(); 
d.setFullYear(selectYear.options[selectYear.selectedIndex].value); 
d.setMonth(selectMonth.options[selectMonth.selectedIndex].value-1); 
d.setDate(selectDay.options[selectDay.selectedIndex].value); 
alert(days[d.getDay()]); 

Se trabajará la mayor parte del tiempo. Pero tendrá problemas cuando la fecha actual sea 31 y cuando intente establecer la fecha en 31 para cuando se establezca en un mes con menos de 31 días.

Esta es una buena manera:

var days = ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"]; 
var d = new Date(0); // solves all problems for existing dates 
d.setFullYear(selectYear.options[selectYear.selectedIndex].value); 
d.setMonth(selectMonth.options[selectMonth.selectedIndex].value-1); 
d.setDate(selectDay.options[selectDay.selectedIndex].value); 
if(d.getDate() == selectDay.options[selectDay.selectedIndex].value) { 
    alert(days[d.getDay()]); 
} 
else { 
    alert("this date doesn't exist"); // date was changed cuz date didn't exist 
} 

La construcción de la fecha con new Date(0) establece la fecha al 1 de enero, esto es bueno porque la fecha no es 31 y enero con 31 días que nos dan el espacio que necesitamos . No fallará el día 31 y no es necesario que configuremos los datos en ningún orden especial. Siempre funcionará

Si el usuario establece el mes a septiembre (30 días) y la fecha a 31, el objeto de datos tendrá 1 oct. O 1 sep. (Según el orden en que los haya configurado). Lo cual es irrelevante porque ambos están equivocados. Un simple chequeo si la fecha es a la que lo configuramos nos dirá si la fecha es una fecha existente, si no, podemos decirle esto al usuario.

Cuestiones relacionadas