首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有JS和输入表单的两个日期之间有多少个周六和周日

问有JS和输入表单的两个日期之间有多少个周六和周日
EN

Stack Overflow用户
提问于 2019-03-06 04:41:57
回答 3查看 731关注 0票数 0

我想知道两个日期之间有多少个周六和周日。

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

代码语言:javascript
复制
<input value="" type="date" name="exit_end_document" id="exit_end_document" class="form-control" required>

我的Javascript是:

代码语言:javascript
复制
 var fromDate = $('#exit_end_document').val();

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

我见过很多例子,但没有一个是这样做的。

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

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2019-03-06 05:13:11

为了处理闰年、时区和诸如此类的事情,我建议测试所有的日期间隔,并测试它们,看看它们是周六还是周日:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-03-06 05:15:53

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

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

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

如果结束日期是星期六,但开始日期不是,该怎么办?事实证明,数学仍然是一样的!这与将开始日期从其星期六“移回”相同,这将增加一个部分周,直到它到达前一个星期六。这些部分周被四舍五入,一旦它到达前一个星期六,你将无论如何加1,因为这将是一个完整的周的差额!所以我们和1 + floor(weeks_between_dates)的关系还是不错的。

因此,剩下的唯一可能的组合是两个日期,都不是星期六。这是最复杂的可能性。让我们从简单的开始,假设日期是两个连续的星期三。然后他们相隔一周,两个人之间有一个星期六。很简单。如果他们相隔两周,他们就有两个星期六。但是如果是星期三和下个星期二呢?还有不到一周的时间,但他们之间还有一个星期六。如果是周三和下周四呢?一个多星期,但仍然是一个星期六!因此,在这种情况下,我们想要向上舍入周数,并在此停止,得到ceil(weeks_between_dates)。但是如果它们都在同一周--例如,同一周的星期一和星期五--那么答案就是0。那么,我们如何知道这几天是否属于同一周呢?假设它们已排序,并且开始日期总是在结束日期之前,则当且仅当它们之间的间隔少于1周,并且开始工作日在结束工作日之前时,它们才在同一周内。

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

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2019-03-06 05:33:43

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

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55011234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档