Javascript 获取月的最后一天-输出与预期不同

Javascript 获取月的最后一天-输出与预期不同,javascript,Javascript,我在堆栈溢出上搜索并看到了这个问题的答案。但出于某种奇怪的原因,或者可能是升级到了本可以升级的任何东西。当我在JavaScript中使用:Date(2018,2,0)时,将检索2月的最后一天。但是我检查了所有的答案,为了得到2月的最后一天,我应该写:Date(2018,3,0) 我的问题基本上是这样的。我是否错过了几年前在“检索月最后一天0”技巧中使用的函数的不同输出?我的服务器日期正常,时区也很好。那么,为什么我的结果会与我迄今为止看到的同一个问题的所有答案不同呢 好的,这是我给那些想要它的人

我在堆栈溢出上搜索并看到了这个问题的答案。但出于某种奇怪的原因,或者可能是升级到了本可以升级的任何东西。当我在JavaScript中使用:
Date(2018,2,0)
时,将检索2月的最后一天。但是我检查了所有的答案,为了得到2月的最后一天,我应该写:
Date(2018,3,0)

我的问题基本上是这样的。我是否错过了几年前在“检索月最后一天0”技巧中使用的函数的不同输出?我的服务器日期正常,时区也很好。那么,为什么我的结果会与我迄今为止看到的同一个问题的所有答案不同呢

好的,这是我给那些想要它的人的代码:

// Load calendar days in a TR element
function ShowCalDays(TableId,cyear,cmonth,clickable = "") {
  var curm = parseInt(cmonth,10);
  var cury = parseInt(cyear,10);
  var curd = 0;
  var curw = 0;
  var ictr = 0;
  var trdata = "";
  var newweek = "";
  var cal_tab = document.getElementById(TableId);
  var cal_tr = 0;
  var cal_td = 0;
  var cal_txt = 0;
  var cal_weeks = document.getElementById("week");

  // Delete all week days to refresh calendar
  while (cal_weeks) {
    cal_weeks.parentNode.removeChild(cal_weeks);
    cal_weeks = document.getElementById("week");
  }

  // Last day
  var ldt = new Date(cury,curm,0);
  // First day
  var fdt = new Date(parseInt(cyear,10),parseInt(cmonth,10),1);
  // Retrieve last day of month
  curd = ldt.getDate();
  // Get week day number
  curw = fdt.getDay();

  cury = 0;
  cal_tr = document.createElement("tr");
  cal_tab.appendChild(cal_tr);
  // Loop all days of the month and build days table
  for (ictr=0 - curw;ictr<=curd;ictr++) {
    newweek = "";
    cury++;
    cal_td = document.createElement("td");
    if (clickable == "y" && ictr > 0) {cal_td.style.cursor = "pointer";}
    // Set new week row
    if (cury > 7)   {cal_tr = document.createElement("tr");}
    // Set TD value
    if (ictr > 0) {newweek = ictr.toString();}
    // Create td and tr element AND insert text inside
    cal_txt = document.createTextNode(newweek);
    cal_td.appendChild(cal_txt);
    cal_tr.appendChild(cal_td);
    cal_tr.id = "week";
    if (cury > 7){
        cal_tab.appendChild(cal_tr);
        cury = 1;
    }
  }
}
//在TR元素中加载日历日
函数ShowCalDays(TableId、cyear、cmonth、clickable=“”){
var curm=parseInt(厘米月,10);
var cury=parseInt(cyear,10);
var-curd=0;
var-curw=0;
var-ictr=0;
var trdata=“”;
var newweek=“”;
var cal_tab=document.getElementById(TableId);
var cal_tr=0;
var cal_td=0;
var cal_txt=0;
var cal_weeks=document.getElementById(“周”);
//删除所有工作日以刷新日历
while(校准周){
cal_weeks.parentNode.removeChild(cal_weeks);
cal_weeks=document.getElementById(“周”);
}
//最后一天
var ldt=新日期(cury,curm,0);
//第一天
var fdt=新日期(parseInt(cyear,10),parseInt(cmonth,10),1);
//取回月的最后一天
curd=ldt.getDate();
//获取周日数
curw=fdt.getDay();
cury=0;
cal_tr=document.createElement(“tr”);
cal_tab.appendChild(cal_tr);
//循环当月所有天数和生成天数表
对于(ictr=0-curw;ictr 0){cal_td.style.cursor=“pointer”;}
//设置新的星期行
如果(cury>7){cal_tr=document.createElement(“tr”);}
//设置TD值
如果(ictr>0){newweek=ictr.toString();}
//创建td和tr元素并在其中插入文本
cal_txt=document.createTextNode(newweek);
cal_td.appendChild(cal_txt);
cal_tr.appendChild(cal_td);
cal_tr.id=“周”;
如果(cury>7){
cal_tab.appendChild(cal_tr);
cury=1;
}
}
}
我的服务器日期正常,时区也很好

由于javascript是一种客户端脚本语言,除非您使用NodeJS之类的工具在服务器上运行javascript代码,否则服务器上的日期和时区是不相关的。与之相关的是客户机上的日期和时区。

:

注意:参数
month
以0为基础。这意味着
1月=0
12月=11


因此
新日期(2018年2月0日)
创建了一个日期,即3月0日或2月最后一天。Firefox在这种情况下并没有“错误”,其他浏览器也不应该有任何不同,因为这是标准化的行为。

我终于解决了这个问题。在考虑了0的基本答案之后。我又看了一眼我的代码,并做了一些更改,以重试整个过程,使其按预期工作。和往常一样,我的坏消息,我错过了一个小消息。非常感谢你们一如既往的支持

这是最后一段代码,经过了修改,功能正常

// Load calendar days in a TR element
function ShowCalDays(TableId,cyear,cmonth,clickable = "") {
  var curm = parseInt(cmonth,10);
  var cury = parseInt(cyear,10);
  var curd = 0;
  var curw = 0;
  var ictr = 0;
  var trdata = "";
  var newweek = "";
  var cal_tab = document.getElementById(TableId);
  var cal_tr = 0;
  var cal_td = 0;
  var cal_txt = 0;
  var cal_weeks = document.getElementById("week");

  // Delete all week days to refresh calendar
  while (cal_weeks) {
    cal_weeks.parentNode.removeChild(cal_weeks);
    cal_weeks = document.getElementById("week");
  }

  // If month is december, set next month as January of next year
  // to retrieve last day of december
  if (curm == 12) {
    curm = 0;
    cury += 1;
  }

  // Last day
  var ldt = new Date(cury,curm,0);
  // First day
  var fdt = new Date(parseInt(cyear,10),parseInt(cmonth,10)-1,1);
  // Retrieve last day of month
  curd = ldt.getDate();
  // Get week day number
  curw = fdt.getDay();

  cury = 0;
  cal_tr = document.createElement("tr");
  cal_tab.appendChild(cal_tr);
  // Loop all days of the month and build days table
  for (ictr=1 - curw;ictr<=curd;ictr++) {
    newweek = "";
    cury++;
    cal_td = document.createElement("td");
    if (clickable == "y" && ictr > 0) {cal_td.style.cursor = "pointer";}
    // Set new week row
    if (cury > 7)   {cal_tr = document.createElement("tr");}
    // Set TD value
    if (ictr > 0) {newweek = ictr.toString();}
      // Create td and tr element AND insert text inside
      cal_txt = document.createTextNode(newweek);
      cal_td.appendChild(cal_txt);
      cal_tr.appendChild(cal_td);
      cal_tr.id = "week";
      if (cury > 7){
        cal_tab.appendChild(cal_tr);
        cury = 1;
    }
  }
}
//在TR元素中加载日历日
函数ShowCalDays(TableId、cyear、cmonth、clickable=“”){
var curm=parseInt(厘米月,10);
var cury=parseInt(cyear,10);
var-curd=0;
var-curw=0;
var-ictr=0;
var trdata=“”;
var newweek=“”;
var cal_tab=document.getElementById(TableId);
var cal_tr=0;
var cal_td=0;
var cal_txt=0;
var cal_weeks=document.getElementById(“周”);
//删除所有工作日以刷新日历
while(校准周){
cal_weeks.parentNode.removeChild(cal_weeks);
cal_weeks=document.getElementById(“周”);
}
//如果月份是12月,则将下个月设置为下一年的1月
//取回十二月的最后一天
如果(curm==12){
curm=0;
cury+=1;
}
//最后一天
var ldt=新日期(cury,curm,0);
//第一天
var fdt=新日期(parseInt(cyear,10),parseInt(cmonth,10)-1,1);
//取回月的最后一天
curd=ldt.getDate();
//获取周日数
curw=fdt.getDay();
cury=0;
cal_tr=document.createElement(“tr”);
cal_tab.appendChild(cal_tr);
//循环当月所有天数和生成天数表
对于(卢旺达问题国际法庭=1-curw;卢旺达问题国际法庭0){cal_td.style.cursor=“pointer”;}
//设置新的星期行
如果(cury>7){cal_tr=document.createElement(“tr”);}
//设置TD值
如果(ictr>0){newweek=ictr.toString();}
//创建td和tr元素并在其中插入文本
cal_txt=document.createTextNode(newweek);
cal_td.appendChild(cal_txt);
cal_tr.appendChild(cal_td);
cal_tr.id=“周”;
如果(cury>7){
cal_tab.appendChild(cal_tr);
cury=1;
}
}
}

您的标题有点混乱,与问题文本不匹配。你是说Firefox 58.0.2给你的日期与其他浏览器不同吗?你能告诉我你用的是什么代码来确定这一点吗?这能解释为什么Firefox中的结果是不同的吗?这就是标题所说的…@MikeMcCaughan嗯,我也在想这个。所有浏览器的Firefox在诸如
Date
构造函数之类的基础上都会这样做,这是毫无意义的。。。我无法检查其他浏览器是否“错误”。我更改了月份,在其中添加了1,但仍然不是正确的日期。这并不能回答问题。我同意,但我想指出这一点。也许我把它作为评论写会更好?我把它作为一个答案来写,因为评论中没有引用,这样写起来更容易this@user3362334是的,一个评论更合适。我通常在评论中用斜体和双引号表示一句话:“foobar,还是不是t?”