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

时间:2017-08-29 01:54:23

标签: 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 = the first $payday(day of week) after $temp_date

任何想法如何在PHP中写这个?这个让我很难过。谢谢!

4 个答案:

答案 0 :(得分:1)

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

$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("next $days[$payday]");之类的内容

$days = [ [1] => "monday",
           .... etc

答案 1 :(得分:0)

Jeff,看一下扩展PHP的DateTime对象的Carbon

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

replace()

根据您的具体情况进行调整。

答案 2 :(得分:0)

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

<?php
$date = new DateTime('2017-08-23 23:59:59');
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'));
    $days = ["1", "2", "3", "4", "5"];
    while (!in_array($payDate->format("N"), $days)) {
        $payDate->add(new DateInterval('P1D'));
    }
    return $payDate->format("D Y-m-d");
}
echo "Date + 3 days: ".$date->format('D Y-m-d') . "<br>";
echo "Next payday: ".nextPayday($date);

Demo

或者,如果您需要查找下一个特定日,请改用此功能:

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");
}

答案 3 :(得分:0)

实现目标的另一个版本:

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