Javascript Date()在某些日期返回错误的工作日

时间:2016-08-31 20:21:47

标签: javascript

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

1 个答案:

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