【问题标题】:Calculate number of specific day between two dates in php在php中计算两个日期之间的特定天数
【发布时间】:2020-10-01 11:39:09
【问题描述】:

我想查找两个日期之间的特定天数。我需要一个适合未来使用的解决方案,我想在未来使用任何开始日期和结束日期。

我的代码

$start_date       = new DateTime('2020/10/01');
$end_date         = new DateTime('2020/10/31'); 
$days = array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday');
$diff = $start_date->diff($end_date, true)->days;
foreach ($days as $key => $value) {
   $number_of_days = intval($diff / 7) + ($start_date->format('N') + $diff % 7 >= $key+1);
   $result[$value] = $number_of_days;
}

结果

Array
(
    [Monday] => 5
    [Tuesday] => 5
    [Wednesday] => 5
    [Thursday] => 5
    [Friday] => 5
    [Saturday] => 5
    [Sunday] => 5
)

期待结果

Array
(
    [Monday] => 4
    [Tuesday] => 4
    [Wednesday] => 4
    [Thursday] => 5
    [Friday] => 5
    [Saturday] => 5
    [Sunday] => 4
)

【问题讨论】:

  • “预期结果” - 为什么? 2020 年 11 月有 5 个周一和周日,所有其他日子出现 四次 次。
  • 你的问题是什么?有什么东西不能使用给定的代码吗?你有什么努力让它发挥作用?
  • @04FS 有人编辑了我的问题,他改了月份,现在请检查日期
  • 几乎完全相同 stackoverflow.com/q/15886166/2943403的副本
  • @mickmackusa 有一些不同

标签: php date diff


【解决方案1】:

请检查下一个解决方案:

<?php
// create DateTime objects for date start & date end
$start_date       = new DateTime('2020/11/01');
$end_date         = new DateTime('2020/11/31'); 

// initialize counter array fro each day of week
$res = array(
    'Monday'   => 0,
    'Tuesday'  => 0,
    'Wednesday'=> 0,
    'Thursday' => 0,
    'Friday'   => 0,
    'Saturday' => 0,
    'Sunday'   => 0
);

// iterate dates between $start_date & $end_date
// if $end_date should not be included '<=' should be changed to '<'
while ($start_date <= $end_date) {
    $week_day = $start_date->format('l'); // get weekday for each date in interval
    $res[$week_day]++;                    // increase weekday counter
    $start_date->add(new DateInterval('P1D')); // iterate next day
}

print_r($res);

这里是直播代码PHPize.online

【讨论】:

  • 这个答案缺少教育解释。
  • 如果您可以添加解释以用于教育目的,它可能会帮助很多人
  • 我在代码中添加了解释 cmets。将尝试更好地解释
【解决方案2】:

首先:一周从星期日开始。

    $weekDays = ['Sunday', ...];

那么不要在循环中做不依赖循环值的事情:

$numberOfDays = intval($diff / 7);
foreach ($weekDays as $weekDay) {
    $result[$weekDay] = $numberOfDays;
}
for ($weekDay = $startDate->format('N'), $endWeekDay = $endDate->format('N'); $weekDay != $endWeekday; $weekDay = ($weekDay + 1) % 7){
    $result[$weekday]++;
}

答案可能会有所不同,具体取决于您是否要包括开始日期和结束日期。

【讨论】:

  • “星期从星期日开始” - 你的意思是什么?根据 ISO 8601,星期一是一周的第一天,这是大多数西方国家的共识
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2015-02-26
  • 2019-09-27
相关资源
最近更新 更多