【问题标题】:Iteration between dates in JavascriptJavascript中日期之间的迭代
【发布时间】:2016-06-02 19:04:36
【问题描述】:

我有两个表单字段,它们存储来自先前脚本的日期输出,每个输入 yearstart 和 yearend 都填充了格式为 YYYY-MM-DD 的日期。该脚本由嵌套的 onchange 函数触发,通过从另一个下拉列表中选择年份来填充两个框,然后触发嵌套函数以填充第二个下拉选择项。

<input type="text" name="yearstart" id="yearstart" value="" readonly/>
<input type="text" name="yearend" id="yearend" value="" readonly/>
<select id="weekselect"></select>

<script>
    function getWeeks() {
        document.getElementById("weekselect").innerHTML = "";

        var yearstart = new Date(document.getElementById('yearstart').value);
        var yearend = new Date(document.getElementById('yearend').value);
        var iDate = new Date(yearstart);

        while (iDate < yearend) {
            var newele = document.createElement('option');
            newele.text = toJSONLocal(iDate);
            document.getElementById('weekselect').appendChild(newele);
            iDate.setDate(iDate.getDate() + 7)
        }
    }
</script>

它有效,但遗憾的是,只有当我选择的年份值大于已选择的年份时,它才有效,所以 2015 年、2016 年有效,但我也得到了两年的日期而不是一个,所以我不知道我错过了什么。我只能推测脚本在值更新之前触发了,但是嵌套脚本的执行顺序应该可以防止这种情况发生。

各位有什么想法吗?

【问题讨论】:

  • 一条评论,我认为new Date(...) 不会正确解析YYYY-MM-DD
  • 我认为您需要向我们展示更多代码,以了解它为何过早触发......,
  • 它似乎确实有效,但是通过删除它,填充下拉列表的结果没有改变:(
  • 我不明白/不明白这意味着什么。
  • 我把整个序列放入小提琴jsfiddle.net/hevp9oL7

标签: javascript jquery date


【解决方案1】:

要比较 2 个 Date 对象,请使用 .getTime() 获取自 1970 年 1 月 1 日以来的毫秒数。

工作代码:

while (iDate.getTime() < yearend.getTime()) {

但是,DOM 操作有时不会与 JS 运行时同步,因此输入的.value 可能会返回错误的日期。您向函数传递了一些参数但从未使用过它。

看看我的小提琴 - https://jsfiddle.net/atao634u/

function getDates() {
  var year = document.getElementById('year').value;
  year = new Date(year, 0, 1, 0, 0, 0, 0);
  if (year.getDay() == 0) {
  day=1;
  year = year.setDate(day);
  year = new Date(year);
  }
  else if (year.getDay() != 1) {
    day = 8-(year.getDay());
    year = year.setDate(day);
    year = new Date(year);
    }
  getendDates(year);
  document.getElementById('yearstart').value = year;

}
function getendDates(yearstart) {
  var year = (document.getElementById('year').value);
  year++;
  year = new Date(year, 0, 1, 0, 0, 0, 0);
  if (year.getDay() == 0) {
  day=1;
  year = year.setDate(day);
  year = new Date(year);
  }
  else if (year.getDay() != 1) {
    day = 7-(year.getDay());
    year = year.setDate(day);
    year = new Date(year);
    }
  document.getElementById('yearend').value = year;
  getWeeks(yearstart, year);
}


function getWeeks(yearstart, yearend) {
  document.getElementById("weekselect").innerHTML="";
  //var yearstart = new Date(document.getElementById('yearstart').value);
  //var yearend = new Date(document.getElementById('yearend').value);
  var iDate = new Date(yearstart);

  while (iDate.getTime() < yearend.getTime()) {
    var newele = document.createElement('option');
    newele.text = toJSONLocal(iDate);
    document.getElementById('weekselect').appendChild(newele);
    iDate.setDate(iDate.getDate() + 7)
  }
}

function toJSONLocal (date) {
    var local = new Date(date);
    local.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return local.toJSON().slice(0, 10);
}

【讨论】:

  • 很好的答案,我没有考虑过使用时间比较,因为我更习惯于 PHP 日期操作!我的菜鸟错误,但运行修改立即奏效!
猜你喜欢
  • 2014-05-20
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多