繁体   English   中英

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

[英]Get last day of month - Different output than expected

我已经在 Stack Overflow 上搜索并看到了这个问题的答案。 但出于某种奇怪的原因,或者可能升级到任何可以升级的东西。 当我在 JavaScript 中使用: Date(2018,2,0) ,这将检索二月的最后一天。 但是根据我检查的所有答案,为了获得二月的最后一天,我应该写: 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;
    }
  }
}

根据 MDN 文档

注意:参数month是从 0 开始的。 这意味着January = 0December = 11

所以new Date(2018, 2, 0)创建了一个日期——三月的第 0 天,或者二月的最后一天。 在这种情况下,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;
    }
  }
}

我服务器的日期没问题,时区也很好

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM