首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在日期范围内计数日组合

在日期范围内计数日组合
EN

Stack Overflow用户
提问于 2017-08-03 16:33:59
回答 1查看 220关注 0票数 0

假设您有一系列的日期,例如2017-08-01 - 2017-09-15,以及开始一天(星期一-儿子的数字格式1-7)和endDay。你必须计算这一天的组合数。对于输入4-7,什么是今天-儿子日和提到的日期,输出将是6。你会怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-03 17:11:48

在您的示例中,您将具有以下值:

代码语言:javascript
运行
复制
rangeStart = 2017-08-01
rangeEnd = 2017-09-15
startDay = 4
endDay = 7

我认为您还具有以下功能:

  • weekday(date)确定给定日期的一周中的一天,并将其作为一个数字返回:周一为1,周日为7。
  • date_add(date, days)将天数添加到给定日期,并返回结果日期。
  • date_diff(date1, date2)返回两个日期之间的天数,不包括date2本身,即当两个日期都在同一周的日期上时,这将是7的倍数。

那么,这可能是算法:

代码语言:javascript
运行
复制
# Align range start with closest start day in the range
rangeStart = date_add(rangeStart, (startDay + 7 - weekday(rangeStart)) % 7)
# Align range end with closest end day within the range
rangeEnd = date_add(rangeEnd, -((weekday(rangeEnd) + 7 - endDay) % 7))
# Get number of full weeks in range, and add 1
result = floor(date_diff(rangeStart, rangeEnd) / 7) + 1

注:%是模运算符,floor将十进制数截断到最接近的整数值。

在JavaScript中实现:

代码语言:javascript
运行
复制
// Define utility functions whose implementations depend on the programming language
function weekday(date) {
    return (date.getDay()+6)%7+1; // in JavaScript Sunday is 0
}
function date_add(date, days) {
    var result = new Date(date); // get clone
    result.setDate(result.getDate() + days); // mutate
    return result;
}
function date_diff(date1, date2) {
    return Math.round((date2-date1)/(1000*60*60*24));
}
var floor = Math.floor;

// Main algorithm
function count(rangeStart, rangeEnd, startDay, endDay) {
    rangeStart = date_add(rangeStart, (startDay + 7 - weekday(rangeStart)) % 7);
    rangeEnd = date_add(rangeEnd, -((weekday(rangeEnd) + 7 - endDay) % 7));
    return floor(date_diff(rangeStart, rangeEnd) / 7) + 1;
}

var rangeStart = new Date("2017-08-01"),
    rangeEnd = new Date("2017-09-15"),
    startDay = 4,
    endDay = 7;

var result = count(rangeStart, rangeEnd, startDay, endDay);

console.log(result);

用Python实现:

代码语言:javascript
运行
复制
import datetime

def count(rangeStart, rangeEnd, startDay, endDay):
    rangeStart = rangeStart + datetime.timedelta((startDay + 7 - rangeStart.isoweekday()) % 7)
    rangeEnd = rangeEnd - datetime.timedelta((rangeEnd.isoweekday() + 7 - endDay) % 7)
    return (rangeEnd - rangeStart).days // 7 + 1

rangeStart = datetime.date(2017, 8, 3)
rangeEnd = datetime.date(2017, 9, 15)
startDay = 4
endDay = 7

result = count(rangeStart, rangeEnd, startDay, endDay)

print(result)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45489970

复制
相关文章

相似问题

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