在JavaScript中解析日期时得到错误的结果

Getting wrong results parsing dates in JavaScript

本文关键字:错误 结果 日期 JavaScript      更新时间:2023-09-26

我从一个json字符串开始,它看起来像:["2016-05-28", "2016-05-29", "2016-05-30", "2016-05-31"]

我正在尝试将其转换为Saturday 5/28 Sunday 5/29

我研究了这些答案,并试图实现相同的答案:为什么Date.parse给出错误的结果?和将字符串中的日期转换为插入数据库的日期对象。

但我得到了错误的一天输出。5/28在周六时显示为Tuesday, 5/28

JSFiddle:https://jsfiddle.net/pum40hyx/

这是我的代码,我将日期转换为我想要的字符串:

function convertToNiceDate(inputDate)
{
    var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    var splitString = inputDate.split("-");
    currentDate = new Date(splitString[0], splitString[1], splitString[2]);
    var day = currentDate.getDate();
    var month = currentDate.getMonth();
    //this is the problematic line!
    var dayOfWeek = days[currentDate.getDay()];
    var dateString = dayOfWeek + ", " + month + "/" + day;
    return dateString;
}

使用new Date(year, month[, day[, ...)格式构建新的Date时,月份的范围为0-11。因此,在拆分字符串时,一月应该是0,而不是1

月份:表示月份的整数值,从1月的0开始到12月的11。

这里有一个破解的解决方案来证明这一点:

function convertToNiceDate(inputDate)
{
    var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    var splitString = inputDate.split("-");
    currentDate = new Date(splitString[0], +splitString[1]-1, splitString[2]);
    var day = currentDate.getDate();
    var month = currentDate.getMonth() + 1;
    //this is the problematic line!
    var dayOfWeek = days[currentDate.getDay()];
    var dateString = dayOfWeek + ", " + month + "/" + day;
    return dateString;
}
document.body.innerHTML = convertToNiceDate('2016-01-01');

您还可以执行以下操作:

function convertToNiceDate(inputDate) {
  var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  var splitString = inputDate.split("-");
  currentDate = new Date(inputDate);
  var day = currentDate.getUTCDate();
  var month = currentDate.getUTCMonth() + 1;
  //this is the problematic line!
  var dayOfWeek = days[currentDate.getUTCDay()];
  var dateString = dayOfWeek + ", " + month + "/" + day;
  return dateString;
}
document.body.innerHTML = convertToNiceDate('2016-01-01');

使用setter(也许您应该对所有setter使用parseInt):

var currentDate //with var
   = new Date();
   currentDate.setFullYear(splitString[0]);
   currentDate.setDate(splitString[2]);
   currentDate.setMonth(parseInt(splitString[1])-1);
   //do something with your date object

我刚刚发现,当您拆分字符串时,日期的月份(此处为splitString[1])总是太远了。我认为这是因为它采用了月份(5)的数组,这将代表6月而不是5月(从1月的0开始)。试试:

currentDate = new Date(splitString.toString());