使用JS和输入表单在两个日期之间有多少个星期六和星期日

时间:2019-03-05 20:41:57

标签: javascript html

我试图确定两个日期之间有多少个星期六和星期日。

我从输入日期字段中获得第一个日期

<input value="" type="date" name="exit_end_document" id="exit_end_document" class="form-control" required>

我的Java语言是这样的:

 var fromDate = $('#exit_end_document').val();

我正在获取价值。问题是我不知道如何计算从输入日期字段获得的日期和今天之间的时间。

我看过很多例子,但是没有一个例子...

(输入日期字段)2019-03-01至(此日期直接来自JS)2019-03-05结果= 2

谢谢!

3 个答案:

答案 0 :(得分:0)

为了处理leap年和时区之类的问题,我建议测试所有两天之间的时间,并对其进行测试,以查看它们是否是坐着的还是周日的:

var date1 = new Date("2012-06-04T05:00:00.000Z"); 
var date2 = new Date("2012-08-17T05:00:00.000Z"); 
var weekendDays = 0;
for(var i = +date1, mx = +date2; i<mx; i+=(1000*60*60*24)){ 
   if({0:1,6:1}[new Date(i).getDay()]) weekendDays++;
}

alert(weekendDays); // 20

答案 1 :(得分:0)

让我们对此进行数学分析。

开始日期可以是星期六,也可以不是。同样,结束日期可以是星期六,也可以不是。在最简单的情况下,两个日期都在星期六。那么您可以清楚地看到星期六的数量等于1加上两个日期之间的星期数。

从那里很容易看到,如果开始日期在星期六,但结束日期不在,那么星期六的数量等于1加两个日期之间的星期数。 ,因为截止日期的一周尚未到星期六。事实证明,同样的数学方法也适用于第一个示例,因为日期之间的周数为整数。因此,我们只需使用1 + floor(weeks_between_dates)即可涵盖这两个示例。

如果结束日期是星期六而不是开始日期怎么办?事实证明,数学仍然一样!这与从其周六“移回”开始日期相同,这将增加一部分时间,直到到达上一个周六。这些不完整的星期会被下限四舍五入,一旦到达上一个星期六,您还是要加1,因为相差整整一个星期!因此,我们对1 + floor(weeks_between_dates)仍然满意。

因此,剩下的唯一可能组合是两个都不都是星期六的日期。这是最复杂的可能性。让我们从简单开始,假设日期是两个连续的星期三。然后他们相距1周,中间有1个星期六。简单。如果他们相隔两周,则有两个星期六。但是,如果是星期三和下一个星期二,该怎么办?他们之间的时间少于一周,但仍然有一个星期六。如果是星期三和下一个星期四?超过1周,但仍然是1周六!因此,在这种情况下,我们希望将周数四舍五入并停在那里,给我们ceil(weeks_between_dates)。但是,如果它们都在同一周(例如,同一周中的星期一和星期五),则答案仅为0。那么我们如何知道这些天是否属于同一周?假设它们已排序并且开始日期始终在结束日期之前,则当且仅当它们之间的间隔少于1周且开始工作日在结束工作日之前,它们才在同一周。

所以这里的直接条件逻辑是(用伪代码):

weeks_between = floor((days between start and end) / 7)
if start.weekday = Saturday or end.weekday = Saturday, then:
    return 1 + weeks_between
else if weeks_between = 0 and start.weekday is before end.weekday, then:
    return 0
else
  return ceil((days between start and end) / 7)

答案 2 :(得分:0)

我已经找到了解决方案,它来自@zak:

var fromDate = $('#exit_end_document').val();

fromDate = new Date(fromDate);

toDate = new Date();

var weekendDays = 0;

dayMilliseconds = 1000 * 60 * 60 * 24;

date1 = fromDate;

date2 = toDate;

while (date1 <= date2) {
  var day = date1.getDay();

  if (day == 0 || day == 6) {
    weekendDays++;
  }

  date1 = new Date(+date1 + dayMilliseconds);
}

alert(weekendDays);