【问题标题】:count from date to date in a while loop [duplicate]在while循环中从日期到日期计数[重复]
【发布时间】:2018-02-27 04:24:29
【问题描述】:

我想使用 while 循环从一个日期计数到另一个日期,并计算天 + 1 直到它到达最终日期。

例如:

var start = new Date(2011, 08, 15);
var end = new Date(2017, 09, 28);
var expired = false;

while (!expired) {
    // very first iteration would count day + 1 so it will be 2011-08-16
    // and so on till 2017-09-28
    // check if end date and set expired to true, finished while loop
}

alert("Finished!");

我不知道该怎么做(其他答案没有帮助)。有什么想法吗?

【问题讨论】:

  • new Date(2017, 09, 28) 为 2017 年 10 月 28 日创建日期,而不是 2017 年 9 月 28 日。

标签: javascript loops date while-loop


【解决方案1】:

您可以使用 .getDate().setDate() 方法,在 start.setDate(start.getDate() + 1) 中将日期增加一天,这应该是您的代码:

while (!expired) {
    start.setDate(start.getDate() + 1);
    // and so on till 2017-09-28
    if(dateDiffInDays(start, end) == 0) {
       expired = true;
    }
    count++;
}
console.log(count);
alert("Finished!");

演示:

// A useful function to get dates diff in days gotten from: https://stackoverflow.com/a/15289883/3669624
function dateDiffInDays(a, b) {
  var _MS_PER_DAY = 1000 * 60 * 60 * 24;  
  var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
  var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
  return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}

var start = new Date(2011, 08, 15);
var end = new Date(2017, 09, 28);
var expired = false;

var count =0;

while (!expired) {
    start.setDate(start.getDate() + 1);
    // and so on till 2017-09-28
    if(dateDiffInDays(start, end) == 0) {
       expired = true;
    }
    count++;
}
console.log(count);
alert("Finished!");

start 的日期将在每次迭代中增加一天,直到它与end 日期相同,最后count 变量将保留这两天之间的天数。

【讨论】:

  • 工作正常,谢谢!
  • 不客气,很高兴它有帮助。
【解决方案2】:

您可以使用getTime() 方法。

  1. 使用getTime() 将日期转换为毫秒。
  2. 每次循环迭代将 86400 秒(每天的总秒数)添加到 start
  3. 等到警报(循环完成)。

注意

new Date(2011, 08, 15) 是 2011 年 9 月 15 日,而不是 8 月。

new Date(2017, 09, 28) 是 2017 年 10 月 28 日,而不是 9 月。

请参阅this 作为参考或查看下面的代码 sn-p。

var start = new Date(2011, 08, 15).getTime();  // convert time into milliseconds
var end = new Date(2017, 09, 28).getTime();    // convert time into milliseconds
var expired = false;
var count = 0;

/* NOT 15 AUGUST 2011 */
console.log(new Date(2011, 08, 15).toString());
console.log(new Date(2017, 09, 28).toString());
/* NOT 28 SEPTEMBER 2017 */

while (!expired) {
    start += 24*60*60;  // One day has 24 hours * 60 minutes * 60 seconds = 86400 seconds
    count++;
    if (start >= end) expired = true;
}

alert(`Days In Between: ${count} days`);

【讨论】:

  • 您不应通过添加 24 小时来添加天数,因为在实行夏令时的情况下,一年中的 2 天不是 24 小时长。在其他问题的答案中广泛介绍了将日期添加到日期。
  • @RobG 夏令时问题从来没有出现在我的脑海中,因为我住的地方没有实行夏令时。感谢您指出这一点。
  • 我所在的地方也没有夏令时,因为观察它的人不断提醒我。 ;-)
【解决方案3】:

使用getDate方法

var start = new Date(2011, 08, 15);
var end = new Date(2017, 09, 28);
var expired = false;
var count = 0;
while (!expired) {
count++;
  if(start.getYear() == end.getYear() && start.getMonth() == end.getMonth() && start.getDate() == end.getDate()){
    expired = true;
  }
  start.setDate(start.getDate()+1);
}
console.log(count);
alert("Finished!");

【讨论】:

  • 这是不正确的。从 9 月 15 日到 28 日只循环 14 次,到 10 月 28 日才循环。
  • 它应该在 15 到 28 之间循环 14 次,得到 28,你试过这个代码吗?你的期望是什么?
  • @RobG,因为你对这个答案投了反对票,至少让我知道你的期望是什么?
  • OP 期望它循环“从一个日期......到最后一个日期”。我的期望是,如果开始日期是 9 月 15 日,最终日期是 10 月 28 日,那么从开始到结束将循环 43 次。这个答案在 9 月 28 日停止,它永远不会到达最终日期。
  • @RobG 你是对的,我也必须考虑年份,所以它应该循环 (6*365+ 48) 次,更新代码
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多