Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用变量计算日期_Php - Fatal编程技术网

如何在PHP中使用变量计算日期

如何在PHP中使用变量计算日期,php,Php,有人能帮忙创造这种逻辑吗?有点难以解释 如果要选择日期,请添加3天,然后根据数据库值选择下一个日期 假设我们从以下内容开始: $end_date = "2017-08-23 23:59:59" $payday = 5; //1=monday, 2=tuesday, 3=wednesday, 4=thursday, 5=friday //And we want to calculate $paydate: $temp_date = $end_date + 3 days; $pay_date = t

有人能帮忙创造这种逻辑吗?有点难以解释

如果要选择日期,请添加3天,然后根据数据库值选择下一个日期

假设我们从以下内容开始:

$end_date = "2017-08-23 23:59:59"
$payday = 5; //1=monday, 2=tuesday, 3=wednesday, 4=thursday, 5=friday
//And we want to calculate $paydate:
$temp_date = $end_date + 3 days;
$pay_date = the first $payday(day of week) after $temp_date

你知道如何用php写这个吗?这件事难倒我了。谢谢

要添加三天,您可以执行以下操作:

$date = new DateTime('2017-08-23 23:59:59');
$date->add(new DateInterval('P3D'));
$date->modify("next friday");
echo $date->format('Y-m-d') . "\n";
您还可以使用一个查找表或数组,将数字和一周中指定的天数相匹配,并使用类似于
$date->modify(“下一个$days[$payday]”的内容
在哪里

Jeff,看看哪个扩展了PHP的DateTime对象

它允许你以一种非常干净和直观的方式处理日期。根据您的示例:

$date = Carbon::parse('next monday')->toDateString();

根据您的具体情况调整。

这个怎么样?它将获取一个日期,添加3天,然后循环接下来的几天,直到在
$days
数组中找到一天(您可以从数据库中获取):


实现目标的另一个版本:

function nextPayday($dateString, $paydayNum) {
    $paydays = [
            1=>'monday',
            2=>'tuesday',
            3=>'wednesday',
            4=>'thursday',
            5=>'friday'
    ];
    $temp_date_stamp = date('d-m-Y H:i:s', strtotime($dateString.' +3 days'));
    $pay_date_stamp  = strtotime('first '.$paydays[$paydayNum].' '.$temp_date_stamp);

    return date('d-m-Y H:i:s', $pay_date_stamp);
}

$end_date = "2017-08-23 23:59:59";
$payday = 5;

echo nextPayday($end_date, $payday);
结果:

01-09-2017 23:59:59

这应该会让你大吃一惊:谢谢。在添加3天之后,我将尝试选择该日期并查找与“pay_day”设置相对应的下一个日历日。例如,$pay_day=5//1=周一。。。5=friSo我正在尝试采用新日期(在添加3天之后),并从该日期或新的日期中找到第一个星期五。消费发薪日将是每周,您可以使用
$date->modify('nextFriday')
您可以使用查找表确定第二天需要使用Brilliant,谢谢。这正是我需要的(第二部分)。
function nextPayday($date) {
    $date->add(new DateInterval('P3D'));
    echo "Date + 3 days: ".$date->format('D Y-m-d') . "<br>";
    $payDate = $date->add(new DateInterval('P1D'));
    $day = "5";
    while ($payDate->format("N") !== $day) {
        $payDate->add(new DateInterval('P1D'));
    }
    return $payDate->format("D Y-m-d");
}
function nextPayday($dateString, $paydayNum) {
    $paydays = [
            1=>'monday',
            2=>'tuesday',
            3=>'wednesday',
            4=>'thursday',
            5=>'friday'
    ];
    $temp_date_stamp = date('d-m-Y H:i:s', strtotime($dateString.' +3 days'));
    $pay_date_stamp  = strtotime('first '.$paydays[$paydayNum].' '.$temp_date_stamp);

    return date('d-m-Y H:i:s', $pay_date_stamp);
}

$end_date = "2017-08-23 23:59:59";
$payday = 5;

echo nextPayday($end_date, $payday);
01-09-2017 23:59:59