日期变成了2013年4月1日而不是3月31日

3

我有两个函数可以创建一个正确格式的新字符串 (mm-dd-yyyy),但现在似乎不能很好地工作... 当我输入日期 31-03-2013 时,它输出了 04-01-2013,也就是在这个日期后的第一个月的第一天...

以下是这两个函数:

Date.prototype.sqlDate = Date.prototype.sqlDate || function () {
    return this.getMonth() + "-" + this.getDate() + "-" + this.getFullYear();
};

String.prototype.sqlDate = String.prototype.sqlDate || function () {
    var date = new Date(0);
    var s = this.split("-");
    //If i log "s" here its output is: 
    //    ["31", "03", "2013", max: function, min: function]
    date.setDate(s[0]);
    date.setMonth(s[1]);
    date.setYear(s[2]);
    return date.sqlDate();
};

2
请记住,JavaScript 返回的是基于0的月份值,而日期和年份是基于1的。因此,一月将是0。 - p.campbell
1
哦,糟糕。忘记了这个。 - FabianCook
1
这个 JavaScript 的“特性”是我遇到过的最愚蠢的设计决策之一。 - Pekka
1
@Pekka웃,我希望我能说同样的话。我见过更糟糕的情况,当你调用一个函数时,上下文改变到窗口,这是最愚蠢的。 - gdoron
哎呀,我有点晕了,抱歉。我还没有考虑到0月的情况。 - FabianCook
显示剩余8条评论
2个回答

8

日期的月份是从0-Jan到11-Dec的数字表示,因此3表示四月...

这非常令人烦恼,因为:

  • day- 1到31,以1为基准索引
  • month- 0到11,以0为基准索引

好吧...这就是 JavaScript 的规范... 继续。

MDN

您可以使用以下方法将其设置正确:

date.setMonth(parseInt(s[1], 10) - 1);

你可以在这里看到它的工作效果:

example


3
试试这个:
String.prototype.sqlDate = String.prototype.sqlDate || function () {
    var date = new Date(0);
    var s = this.split("-");
    //If i log "s" here its output is: 
    //    ["31", "03", "2013", max: function, min: function]
    date.setDate(s[0]);
    date.setMonth(parseInt(s[1],10)-1);
    date.setYear(s[2]);
    return date.sqlDate();
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接