在从2017年9月1日及之后的日期错误的工作日获得该问题后,我发现更改1 statemtent(setDate)的顺序会返回正确的结果。见下面的代码。当我输入1。9。17(2017年9月1日)时,我会在星期天得到星期日的变更代码。有人可以向我解释一下吗?问题出现在FF,Chrome和Edge中。
<body>
<input type="text" onchange="wday(this.value);">
<script>
function wday() {
var x = wday.arguments[0].split(".");
if (x[2].length<4) x[2] += 2000;
var y = new Date();
y.setFullYear(x[2]);
y.setMonth(x[1]-1);
y.setDate(x[0]);
var z = new Array("So","Mo","Di","Mi","Do","Fr","Sa");
alert("wrong "+z[y.getDay()])
wday2(wday.arguments)
}
function wday2() {
var x = wday.arguments[0].split(".");
if (x[2].length<4) x[2] += 2000;
var y = new Date();
y.setDate(x[0]);
y.setMonth(x[1]-1);
y.setFullYear(x[2]);
var z = new Array("So","Mo","Di","Mi","Do","Fr","Sa");
alert("correct "+z[y.getDay()])
}
</script>
</body>
答案 0 :(得分:2)
setMonth
可以将月份设置为当前日期(今天是第31天; 9月有30天)不存在的月份。溢出将转入下个月的适当日期。
> var d = new Date();
> d
Wed Aug 31 2016 13:30:07 GMT-0700 (PDT)
> d.setMonth(8); // September
> d
Sat Oct 01 2016 13:30:07 GMT-0700 (PDT)
一次构建日期以完全避免此类问题。您的年度调整代码也被破坏(它将连接2000
而不是添加它),并且使用func.arguments
引用参数实际上是不好的做法。
var WEEKDAYS = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
function wday(dateString) {
var parts = dateString.split('.');
var year = parseInt(parts[2], 10);
var month = parseInt(parts[1], 10);
var day = parseInt(parts[0], 10);
if (parts[2].length < 4) {
year += 2000;
}
var date = new Date(year, month - 1, day);
return WEEKDAYS[date.getDay()];
}
使用更多功能获得奖励积分。
const WEEKDAYS = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
function parseYear(yearString) {
const year = parseInt(yearString, 10);
return yearString.length < 4 ?
year + 2000 :
year;
}
function parseDottedDate(dateString) {
const [day, month, year] = dateString.split('.');
return new Date(
parseYear(year),
parseInt(month, 10) - 1,
parseInt(day, 10)
);
}
function wday(dateString) {
const date = parseDottedDate(dateString);
return WEEKDAYS[date.getDay()];
}