【问题标题】:Find number of days ( comma separated ) between two dates in php在php中查找两个日期之间的天数(逗号分隔)
【发布时间】:2018-10-19 04:19:52
【问题描述】:

我有逗号分隔的天数(1,3,5,6),我想计算两天之间的天数。

我已经按照以下方式完成了。

$days=$model->days; // comma saperated days
$days=explode(',',$days); // converting days into array


$count=0;
$start_date = $model->activity_start_date; // i.e. 2018-03-27
$end_date = date('Y-m-d');


while(strtotime($start_date) <= strtotime($end_date)){
  if(in_array(date("N",strtotime($start_date)),$days)){ // check for day no
      $count++;
  }
  $start_date = date ("Y-m-d", strtotime("+1 day", strtotime($start_date)));
}

此代码运行良好。但问题是,如果两个日期之间的差异是一年或一年以上,那么它会循环 365 次或更多。

有什么方法可以减少执行时间以计算天数。或者可以使用 mysql 查询获取天数。

真实场景:我有一个事件有开始日期,它在一周内发生多次(即星期一和星期三),我想知道从开始日期到现在事件发生了多少次。如果开始日期是 2018 年 4 月 9 日,今天是 2018 年 5 月 9 日,则计数将为 9

【问题讨论】:

  • 您可以使用 mysql 函数 datediff() 来获取日期之间的天数。请尝试一下。可能它会为你使用。选择日期差异('2018-05-08', '2018-05-01');
  • 向您的问题添加示例输入和输出格式
  • 输入为开始日期,输出为天数
  • 所以你需要echo count(explode(',',$days));?
  • 用输入和输出更新你的问题,这有多难?我现在投了赞成票。

标签: php yii2


【解决方案1】:

这不需要循环。

我找到开始和结束之间的周数,并将整周(在您的示例中为 16、17、18)乘以天数。
然后我发现第一周 (15) 中有多少天高于或等于 startday 的天数。
然后是第 19 周的对立面。

$days="1,3"; // comma saperated days
$days=explode(',',$days); // converting days into array


$count=0;
$start_date = "2018-04-09";
$end_date = "2018-05-09";

// calculate number of weeks between start and end date
$yearW = floor(((strtotime($end_date) - strtotime($start_date)) / 86400)/7);

if($yearW >0) $count = ($yearW -1)*count($days); //full weeks multiplied with count of event days    

$startday = date("N", strtotime($start_date));
$endday = date("N", strtotime($end_date));

//find numer of event days in first week (less than or equal to $startday)
$count += count(array_filter($days,function ($value) use($startday) {return ($value >= $startday);}));

//find numer of event days in last week (less than $endday)
$count += count(array_filter($days,function ($value) use($endday) {return ($value < $endday);}));


echo $count; // 9

https://3v4l.org/9kupt

添加了 $yearW 来保存年周

【讨论】:

  • @rob006 已更新以处理年份。
  • 它在几年内仍然无法正常工作 - 一年并不总是有 52 周。
  • @rob006 好点。我改为计算天数并除以 7。
【解决方案2】:

在这里,我有一个我以前在项目中使用过的代码。它用于查找日期与今天之间的距离。

public function diffFromToday($date){
        $today = date('jS F, Y');

        $today = str_replace(',','',$today);
        $today=date_create($today);
        $today = date_format($today,"Y-m-j"); 

        $date = str_replace(',','',$date);
        $date=date_create($date);
        $date = date_format($date,"Y-m-j");

        $today=date_create($today);
        $date=date_create($date);

        $diff=date_diff($today,$date);
        $result = $diff->format("%R%a");
        $result = str_replace('+','',$result);
        return $result;

    }

您可以根据自己的需要使用此功能。该函数使用的日期格式为'jS F, Y',请勿混淆,请使用自己的格式进行转换。

【讨论】:

  • 我不需要日期差异,我需要计算逗号分隔的天数
  • 您应该在代码审查上发布此代码,并让人们帮助您。这真是糟糕的代码,你会从中受益良多。
  • 嗯,这是我2年前用过的函数(当时刚开始学习PHP)。我只是不修改它并按原样回答,但感谢您的建议。非常感谢。
  • 此代码将返回您在两个不同日期之间的天数。它实际上是整数$diff=date_diff($today,$date); echo $diff-&gt;format("%R%a");@Yasin Patel
【解决方案3】:
$start_date =  date_create('2018-03-27');
$end_date = date_create('2018-04-27');
$t = ceil(abs($endDate- $start_date) / 86400);
echo date_diff($start_date, $end_date)->format('%a');

这样输出

396

【讨论】:

  • 我不需要日期差异,我需要计算逗号分隔的天数
【解决方案4】:

难道你不能使用 date->diff 函数来获取你可以直接使用的值,比如 -5 或 5 吗?

$diffInDays = (int)$dDiff->format("%r%a");

Here 是格式参数描述的东西,如果它对你有帮助的话。

【讨论】:

  • 我不需要日期差异,我需要计算逗号分隔的天数
【解决方案5】:

您可以为此使用tplaner/when 库:

$days = str_replace(
    ['1',  '2',  '3',  '4',  '5',  '6',  '0',  '7'], 
    ['mo', 'tu', 'sa', 'th', 'fr', 'sa', 'su', 'su'],
    '1,3'
);

$when = new When();
$when->rangeLimit = 1000;
$occurrences = $when->startDate(new DateTime('2018-04-9'))
    ->freq('daily')
    ->byday('mo,we')
    ->getOccurrencesBetween(new DateTime('2018-04-9'), new DateTime('2018-05-9'));

echo count($occurrences);

【讨论】:

  • OP 没有“mo,we”作为输入。
  • @Andreas 将1 转换为mo 应该不是挑战。
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多