【问题标题】:How to calculate if date range is within this week [closed]如何计算日期范围是否在本周内[关闭]
【发布时间】:2022-01-23 16:13:40
【问题描述】:

我使用返回以下数据的 API:

{
"count": 3,
"data": [
    {
        "id": "11ec62fcfc82e511b06a756430fa6a9e",
        "type": "HOLIDAY",
        "from": "2021-12-13",
        "to": "2021-12-19",
        "resourceId": "11ec46d6abeeeb08b8f937e6be68fdf0",
        "createdAt": "2021-12-22T07:58:44"
    },
    {
        "id": "11ec5e81746041328bd6f1d234a6c496",
        "type": "ILLNESS",
        "from": "2021-12-15",
        "to": "2021-12-17",
        "resourceId": "11ec46e7a62ab8f6b8f937e6be68fdf0",
        "createdAt": "2021-12-16T03:04:23"
    },
    {
        "id": "11ec62ff1df2654d8bd6f1d234a6c496",
        "type": "HOLIDAY",
        "from": "2021-12-24",
        "to": "2021-12-24",
        "resourceId": "11ec46d6547a00728be3e1ed8ff29535",
        "createdAt": "2021-12-22T08:14:00"
    }
],
"success": true
}

这些是假期和疾病数据。我有一份每周报告,我需要计算特定“ressourceID”在该周内休假/生病的天数。如何计算特定周内“从”-“到”范围内的天数?

我不知道如何轻松做到这一点。我在考虑 https://www.php.net/manual/de/datetime.format.php 将其转换为“z”格式,但我也找不到简单的方法。

让我添加一个我正在寻找的示例,我认为这个问题并不清楚:

假设我们有下一周:

考虑周:20.12。 - 24.12.

现在我们可以有以下缺勤情况以及如何考虑这些情况

案例 1:缺勤在 Weekstart 之前开始并在一周内结束

缺席:15.12。 - 21.12.

=> 在这种情况下,一周中包含 2

案例 2:缺勤在 Weekstart 之前开始并在一周之后结束

缺席:15.12。 - 26.12.

=> 在这种情况下,一周中包含 5

案例 3:缺勤在一周内开始,在一周内结束

缺席 = 20.12。 - 22.12.

=> 在这种情况下,一周中包含 3

案例 4:缺勤始于一周内,一周后结束

缺席:21.12。 - 29.12.

=> 在这种情况下,一周中包含 4

一般来说,我正在寻找一种方法来比较 2 个日期范围(周和缺席)并获取两个范围之间的交集天数。 In Chinese: 我这周有多少天的假期/病假。

【问题讨论】:

  • 您需要从 FROM DATE 到当前日期的周数还是应该是 TO DATE 减去 FROM DATE?
  • 我们有很多预先存在的页面来演示如何使用 DateTime 对象和diff() 方法。您尚未描述所提供输入的确切期望输出。
  • @mickmackusa 很清楚,比如Week 39: 7 daysWeek 40: 5 days等等
  • 我将更新我的问题以使其更清楚。 @丹尼尔W。 - 你说得对,这就是我要找的
  • 所需输出的格式对于确保所有答案都达到完全相同的结果至关重要。如果没有完整的minimal reproducible example,我们将有一个包含一堆不同答案的页面,这些答案提供的结果略有不同——这不适合这个问答。目前,这个问题看起来像是一个需要更多关注的“需求转储”。

标签: php date datetime


【解决方案1】:

以下代码将根据 FROM DATE & TO DATE GIVEN 给出周数。

$from = new \DateTime('2020-12-15');
$to = new \DateTime('2020-12-17');
$weeks = date_diff($to,$from)->days/7;

如果结果为 0 则为第一周。

或者,如果您想获取基于 FROM DATE 到 CURRENT DATE 的周数。

$from = new \DateTime('2020-12-15');
$to = new \DateTime();
$weeks = date_diff($to,$from)->days/7;

【讨论】:

  • 我认为他需要总结每周的总休息天数 (date('W'))
  • @DanielW。 - 你说的对。我只想计算某个日期范围内的休息天数。例如。如果日期范围在 20.12 之间。 -24.12。我从 15.12 开始休假。 - 21.12。该函数应返回 2 天。因为假期跨周只在 20.12。和 21.12.. 谢谢!
【解决方案2】:

这将遍历数组并检查日期是否在本周创建。

// This is the json string that was returned
$jsonString = '{"count":3,"data":[{"id":"11ec62fcfc82e511b06a756430fa6a9e","type":"HOLIDAY","from":"2021-12-13","to":"2021-12-19","resourceId":"11ec46d6abeeeb08b8f937e6be68fdf0","createdAt":"2021-12-22T07:58:44"},{"id":"11ec5e81746041328bd6f1d234a6c496","type":"ILLNESS","from":"2021-12-15","to":"2021-12-17","resourceId":"11ec46e7a62ab8f6b8f937e6be68fdf0","createdAt":"2021-12-16T03:04:23"},{"id":"11ec62ff1df2654d8bd6f1d234a6c496","type":"HOLIDAY","from":"2021-12-24","to":"2021-12-24","resourceId":"11ec46d6547a00728be3e1ed8ff29535","createdAt":"2021-12-22T08:14:00"}],"success":true}';

// This will decode the json string make an array
$data = json_decode($jsonString, true);

// Function to check date was created this week
function checkWeek($date) {
    // will get current date and - 7 days
    $ThisWeek = time() - (7 * 24 * 60 * 60);
    
    // will change from date from string to timestamp
    $DateCreated = strtotime($date);
    
    // will check if the createdDate > this week
    if($DateCreated >= $ThisWeek) {
        echo $date . ", Was Created This Week.\n";
        return true;
    }
    return false;
}

// Loop through all values and check which one is created this week
foreach ($data["data"] as &$value) {
    checkWeek($value["createdAt"]);
}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多