【问题标题】:Getting wrong results parsing dates in JavaScript在 JavaScript 中获取错误的结果解析日期
【发布时间】:2016-05-03 02:58:50
【问题描述】:

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

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

我查看了这些答案并尝试实施相同的方法: Why does Date.parse give incorrect results?Convert date in string to date object for inserting in database.

但是我得到了错误的日期输出。 星期六时,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;
}

【问题讨论】:

  • 正如@timolawl 提到的,您必须将日期更改为["2016-04-28", "2016-04-29", "2016-04-30", "2016-04-31"]
  • @starky——你误读了 timolawl 的回答。月份数在解析中更改,而不是在输入中。
  • @RobG 是的,当然,你是对的。

标签: javascript json date


【解决方案1】:

当使用new Date(year, month[, day[, ...) 格式构造新的Date 时,月份的范围是0-11。所以当字符串被拆分时,一月应该是0,而不是1

月份: 表示月份的整数值,从 0 开始表示一月到 11 表示十二月。

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

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');

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 通过用文字解释您如何解决问题,零解释的答案总是会更好。不必研究代码并将其与其他代码进行比较即可弄清楚您所做的更改。
    • 这或多或少会随机失败。如果在 2017 年 2 月 28 日的 7 月 31 日这样的日期运行,将日期设置为 31 将导致 5 月 3 日,然后将月份设置为 7 月将导致 7 月 3 日,而不是 7 月 31 日。为避免此类问题,请在调用 setFullYear 时一次性设置所有部分:currentDate.setFullYear(splitString[0], splitString[1])-1, splitString[2]);
    【解决方案3】:

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

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

    【讨论】:

    • 这会将像“2016,05,28”这样的字符串作为单个参数传递,Date 构造函数将尝试对其进行解析。它可能正确也可能不正确,但结果可能是无效的日期(Chrome 可以,IE 不行)。
    • 感谢 Rob 的测试。我尝试过使用 Chrome,最终效果很好。很高兴知道它在某些浏览器中是有问题的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多