【问题标题】:How many saturdays and sundays between two dates with JS and Input FormJS和输入表单的两个日期之间有多少个星期六和星期天
【发布时间】:2019-03-05 20:41:56
【问题描述】:

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

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

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

我的 Javascript 是这样的:

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

我得到了值。问题是我不知道如何计算从输入日期字段中获得的日期和今天之间的日期。

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

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

谢谢!

【问题讨论】:

  • 他们的关键是寻找做类似事情的解决方案,然后根据您的需要进行调整。
  • 2019-03-01 和 2019-03-05 之间没有两个周末。您真的想要给定范围内的周六和周日总数吗?
  • 是的,我修好了你是对的
  • @Zak 该示例的问题在于它直接添加了日期 var date1 = new Date('06/04/2012'); var date2 = new Date('08/17/2012');如何输入从输入字段中获取的日期以及从今天开始的日期?

标签: javascript html


【解决方案1】:

让我们用数学方法分析一下。

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

从那里很容易看出,如果开始日期是星期六,但结束日期不是,那么星期六的数量等于 1 加上两个日期之间的周数向下取整 因为结束日期的周还没有到星期六。事实证明,相同的数学运算也适用于第一个示例,因为日期之间的周数为整数。所以我们可以通过简单地使用1 + floor(weeks_between_dates) 来涵盖这两个示例。

如果结束日期是星期六,但开始日期不是?事实证明,数学仍然是一样的!这与从星期六开始“向后移动”开始日期相同,这将增加一个星期,直到它到达上一个星期六。那些部分的周数被地板四舍五入,一旦它到达上一个星期六,你无论如何都会加 1,因为这将是一整周的差值!所以我们仍然可以使用1 + floor(weeks_between_dates)

所以剩下的唯一可能的组合是两个都不是星期六的日期。这是最复杂的可能性。让我们从简单的开始,假设日期是连续的两个星期三。然后他们相隔 1 周,他们之间有 1 个星期六。简单的。如果他们相隔两周,他们就有 2 个星期六。但是如果是星期三和下一个星期二呢?他们之间还有不到一周的时间,但仍有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 月至 3 月的边界,则差值会加 1。
【解决方案2】:

为了处理闰年和时区之类的,我建议测试所有天之间的时间并测试它们是否是周六或周日:

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

【讨论】:

  • Date(string) 的行为,除了一些来自 ISO 8601 的格式之外,还取决于实现。使用时要小心。
  • @HereticMonkey:当然。 OP 的源格式是&lt;input type=date&gt;,但它应该输出可解析的格式。我也会向它添加时区信息,尽管从技术上讲,如果所有计算都是在本地时区进行的,那么偏移量应该会抵消,我认为......
  • 我觉得我们使用Date(string)展示的示例代码越少越好。
  • @HereticMonkey。我在 ie+ch+ff 中进行了测试,并对其进行了解析,但承认了一点;我将示例格式更改为 ISO。实际上,由于 JS 愚蠢的零一月事情,我在这里使用数字列表(例如 new Date(y,m,d...))在这里看到了更多的日期问题,但字符串也有问题。我认为他们正在为未来的 ES 重新制定日期,希望这会是一件好事......
【解决方案3】:

我已经找到了解决方案,它是由@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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多