Javascript getDay返回4月,6月,9月,11月的错误值

时间:2011-05-31 18:41:15

标签: javascript

我正在使用此脚本:http://www.javascriptkit.com/script/script2/dyndateselector.shtml

如果你尝试了,并且去了4月,6月,9月或11月的任何一个,你会注意到星期几列不正确。这是一个不正确的数据列表(x开始的东西显示在下个月。)

错误月份: 4月4日(周日而不是周五开始) 可能从周日开始

6月6日(星期五而不是星期三开始) 七月从星期五开始

9月9日(星期六而不是星期四开始) 十月从星期六开始

11月11日(星期四而不是星期二开始) 12月开始于周四

您会注意到每个错误的月份都是从下个月的某一天开始,但所有其他月份似乎都是正确的。

我在这个问题上找不到任何东西。有人能帮忙吗?可以在此处找到实际的Javascript,并在第125行发出getDay()方法:http://pastebin.com/0zuBYrzv

我已经在Firefox和Chrome中进行了测试。

以下是一些非常简单的代码来演示此问题:

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

这将创建一条警告,其中包含星期五(5 + 1 = 6,星期五是本周的第6天),而实际上星期三是本周的开始。

5 个答案:

答案 0 :(得分:8)

这实际上非常有趣,因为我猜明明天你的原始代码会再次按你的意愿运行。

我认为正在发生的是你正在创建一个新的Date,它将自动初始化为今天(五月三十一日)。 然后你将月份设置为6月,你基本上将它设为6月31日。此日期不存在,因此javascript会将其变为7月1日。 最后你设置了日期,但由于你的月份不再是你想要的,结果将是错误的。

答案 1 :(得分:4)

看起来0是1月,11是12月。

答案 2 :(得分:1)

如果我设置月份,全年和日期,显然JavaScript不喜欢它。我必须做的是将它们全部设置在一个函数中,如下所示:

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

答案 3 :(得分:0)

我认为这是Javascript日期对象中的一个错误。 请查看以下代码。 (我在线使用w3school's JSref tool快速查看。) 请注意,以下使用的方式由w3 schools themselves告知。

  

实例化日期的一些例子:

     

var today = new Date()
  var d1 = new Date(“1975年10月13日11:13:00”)
  var d2 = new Date(79,5,24)(//这是错误的 - 意外结果!!!)
  var d3 = new Date(79,5,24,11,33,0)

所以在使用这个Date对象时要小心,看起来某些实例化日期的方式比其他方式更好。

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

输出(全部使用2011年1月1日的某种格式)是:

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)

根据这个问题的其他答案,我猜这与我目前(2011年8月26日)的那天有关 - 这将是我的首发新日期()以及以错误的顺序应用的日期和/或年份。 但是,肯定会很好if this thing worked

答案 4 :(得分:-1)

这是典型的错误做法:

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()]);

它大部分时间都可以使用。但是当当前日期为31时以及尝试将日期设置为31时设置为少于31天的月份时会出现问题。

这是一个好方法:

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
}

使用new Date(0)构建日期将日期设置为1月1日,这很好,因为日期不是31日,1月有31天,这给了我们所需的空间。它不会在31日失败,我们不需要按任何特殊顺序设置数据。它总是有效。

如果用户将月份设置为9月(30天),将日期设置为31,则数据对象将保持1个oct或1个sep(具体取决于您将其设置为的顺序)。这是无关紧要的,因为它们都是错的。如果日期是我们设置的日期,只需检查日期是否为现有日期,如果不是,我们可以告诉用户。