【问题标题】:PHP Select a random date in a range from given weekdayPHP 在给定工作日的范围内选择一个随机日期
【发布时间】:2019-07-15 14:32:46
【问题描述】:

我有以下生成随机日期的函数:

   function createARandomDateBetweenRange(Carbon $start, Carbon $stop, int $weekDay=null) : Carbon
    {
        $randDate = random_int($start->getTimestamp(), $stop->getTimestamp());
        $radomDate = Carbon::createFromTimestamp($randDate);

        return $radomDate
    }

但由于某种原因,我需要能够从提供的工作日中随机选择一个星期一、星期二等(0 是星期日,6 是星期六)

所以我把定义改成了:

use Carbon\Carbon;

    public static function createARandomDateBetweenRange(Carbon $start, Carbon $stop, ?int $weekDay=null) : Carbon
    {
        $randDate = random_int($start->getTimestamp(), $stop->getTimestamp());
        $radomDate = Carbon::createFromTimestamp($randDate);

        if($weekDay!=null && $weeekDay >= Carbon::SUNDAY  && $weekDay <= Carbon::SATURDAY)
        {
          // Modify the date in order to get the correct date here

        }

        return $radomDate;
    }

那么我如何从指定的日期范围和随机日期时间中获取正确的日期作为我作为参数提供的特定工作日?

例如当我调用函数时:

use Carbon\Carbon;

$now = Carbon::now()
$fiveMonthsLater= new Carbon($now);
$fiveMonthsLater->modify("+5 months");

$randomTuesday=createARandomDateBetweenRange($now,$fiveMonthsLater,Carbon::TUESDAY);

$randomSaturday=createARandomDateBetweenRange($now,$fiveMonthsLater,Carbon::SATURDAY);

echo $randomTuesday->isoFormat("dddd"); //Outputs Tuesday
echo $randomSaturday->isoFormat("dddd"); //Outputs Saturdat

【问题讨论】:

  • 我有点不清楚你想要什么......
  • 获取所有星期一的时间。从下方随机获取 - stackoverflow.com/questions/7061802/…
  • @splash58 我需要能够spacify 任何工作日来做到这一点。我不想只是重复星期一,
  • 选择你想要的日子

标签: php date


【解决方案1】:

您可以将期间过滤到您想要的日期,然后随机选择一个。

use Carbon\CarbonPeriod;

$period = CarbonPeriod::between('2000-01-01', '2000-12-31');

// Define your filters
$mondayFilter = function ($date) { return $date->isMonday(); };
$tuesdayFilter = function ($date) { return $date->isTuesday(); };
...

// Apply your filter
$mondays = $period->filter($mondayFilter)->toArray();

// Grab a random date from your filtered period. 
var_dump(
    $mondays[array_rand($mondays)]
);

编辑

将其集成到您当前的示例中:

use Carbon\CarbonPeriod;

function createARandomDateBetweenRange($start, $end, $filter = null)
{
    $period = CarbonPeriod::between($start, $end);

    if ($filter) {
        $period = $period->filter($filter);
    }

    return $period;
}

// Define your filters
$mondayFilter = function ($date) { return $date->isMonday(); };
$tuesdayFilter = function ($date) { return $date->isTuesday(); };

// Optionally, pass in your filter.
$period = createARandomDateBetweenRange('2001-01-01', '2001-12-31', $tuesdayFilter);

$period = $period->toArray();

var_dump(
    $period[array_rand($period)]
);

【讨论】:

    【解决方案2】:

    也许你可以试试这个而不是所有的碳? 我刚刚写了这篇文章,但它似乎运作良好。希望它能给你一些想法。

    基本上,它会在范围内找到第一个匹配的日期,然后计算出从该点到最后匹配的完整周数,并将该数字用于随机部分。

    // The Function
    function nextRandomDay($dayLabel,$from,$to){
        $i=0;
        while(date("l",$from) != $dayLabel && $i<10){
            $i++;
            $from = strtotime("NOW + 1 day",$from);
        }
        if($i>8){return false;} // Invalid day label
        return strtotime("NOW + ".rand(0,floor(($to-$from) / (86400*7)))." weeks",$from);
    }
    
    // EXAMPLE
    $from   = time(); // Where to start looking from
    $to     = strtotime("NOW + 71 days"); // When to stop looking
    $day    = "Tuesday"; // Full string day name
    
    if($myDate = nextRandomDay($day,$from,$to)){
        echo "Found a '$day' on ".date("d/m/Y",$myDate)." ($myDate)";
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2011-07-01
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多