PHP 中的 DateDiff 导致致命错误:允许的 X 字节内存大小已耗尽(尝试分配 X)

发布于 2025-01-11 03:23:37 字数 3164 浏览 0 评论 0原文

我正在尝试获取 PHP 中两个日期之间的差异。

//$tempoAteSaidaEmSegundos = (strtotime($horaSaidaFunc->format('Y-m-d H:m:s'))) - (strtotime($dataC2->format('Y-m-d H:m:s')));

$tempoAteSaidaEmSegundos = date_diff($dataC2, $horaSaidaFunc)->s;

注释行给了我差异,但它不准确,所以我尝试了 date_diff 函数,它给出了我需要的结果,但测试代码时我注意到日期的差异大于 ~ 1/2天导致此错误:

<b>Fatal error</b>:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes) in <b>C:\xampp\htdocs\
public function horarioUtil(DateTime $dataConclusao, $tempoAdicionar, $horaSaida = 18, $minutoSaida = 0, $horaEntrada = 8, $minutoEntrada = 0)
{
    $dataC = clone $dataConclusao;
    $dataC2 = clone $dataConclusao;
    $dataC3 = clone $dataConclusao;
    $horaSaidaFunc = date_time_set($dataC, $horaSaida, $minutoSaida);
    $dataConclusao->modify("+{$tempoAdicionar} seconds");
    if ($dataConclusao >= $horaSaidaFunc) {
        //$tempoAteSaidaEmSegundos = (strtotime($horaSaidaFunc->format('Y-m-d H:m:s'))) - (strtotime($dataC2->format('Y-m-d H:m:s')));
        $tempoAteSaidaEmSegundos = date_diff($dataC2, $horaSaidaFunc)->s;
        return [
            "util" => false,
            "segDiffSaida" => $tempoAdicionar - $tempoAteSaidaEmSegundos,
            "conclusao" => $dataConclusao,
            "nextDay" => $dataC3->modify("+1 day")
        ];
    } else {
        return [
            "util" => true,
            "conclusao" => $dataConclusao
        ];
    }
}

public function geraDataPrevisaoDeConclusao($prioridadeTempoEmSegundos, $horaEntrada = 8, $minutoEntrada = 0, $horaSaida = 18, $minutoSaida = 0, DateTime $datePosFinalDeSemana = null)
{
    if ($datePosFinalDeSemana != null) {
        $today = $datePosFinalDeSemana;
    } else {
        $today = new DateTime('now', new DateTimeZone('America/Sao_Paulo'));
        //$today->modify("+3 day");
    } 

    $bool = $this->horarioUtil($today, $prioridadeTempoEmSegundos, $horaSaida, $minutoSaida);

    if ($bool["util"] === true) {
        // Tempo da prioridade permite a resposta no dia atual. 
        return ($bool["conclusao"]); // Retorna Data de Previsão
    } else {
        // Tempo da prioridade NÃO permite a resposta no dia atual.
        if (!$this->finalDeSemana($bool["nextDay"], false)) { // Verifica se proximo dia é final de semana -> CASE false não é final de semana
            $segundosCalculados = $bool["segDiffSaida"];
            return $this->geraDataPrevisaoDeConclusao($segundosCalculados, $horaEntrada, $minutoEntrada, $horaSaida, $minutoSaida, date_time_set($bool["nextDay"], $horaEntrada, $minutoEntrada));
        } else { //                                                                                  -> CASE true é final de semana
            $segundosCalculados = $bool["segDiffSaida"];
            return $this->geraDataPrevisaoDeConclusao($segundosCalculados, $horaEntrada, $minutoEntrada, $horaSaida, $minutoSaida, date_time_set($bool["nextDay"]->modify("next monday"), $horaEntrada, $minutoEntrada));
        }
    }
}

I'm trying to get the difference between 2 dates in PHP.

//$tempoAteSaidaEmSegundos = (strtotime($horaSaidaFunc->format('Y-m-d H:m:s'))) - (strtotime($dataC2->format('Y-m-d H:m:s')));

$tempoAteSaidaEmSegundos = date_diff($dataC2, $horaSaidaFunc)->s;

The commented line gives me the difference but it's not accurate, so I tried date_diff function, which gives me the result I need, but testing the code I noticed that dates with a bigger difference than ~ 1/2 days cause this error:

<b>Fatal error</b>:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes) in <b>C:\xampp\htdocs\
public function horarioUtil(DateTime $dataConclusao, $tempoAdicionar, $horaSaida = 18, $minutoSaida = 0, $horaEntrada = 8, $minutoEntrada = 0)
{
    $dataC = clone $dataConclusao;
    $dataC2 = clone $dataConclusao;
    $dataC3 = clone $dataConclusao;
    $horaSaidaFunc = date_time_set($dataC, $horaSaida, $minutoSaida);
    $dataConclusao->modify("+{$tempoAdicionar} seconds");
    if ($dataConclusao >= $horaSaidaFunc) {
        //$tempoAteSaidaEmSegundos = (strtotime($horaSaidaFunc->format('Y-m-d H:m:s'))) - (strtotime($dataC2->format('Y-m-d H:m:s')));
        $tempoAteSaidaEmSegundos = date_diff($dataC2, $horaSaidaFunc)->s;
        return [
            "util" => false,
            "segDiffSaida" => $tempoAdicionar - $tempoAteSaidaEmSegundos,
            "conclusao" => $dataConclusao,
            "nextDay" => $dataC3->modify("+1 day")
        ];
    } else {
        return [
            "util" => true,
            "conclusao" => $dataConclusao
        ];
    }
}

public function geraDataPrevisaoDeConclusao($prioridadeTempoEmSegundos, $horaEntrada = 8, $minutoEntrada = 0, $horaSaida = 18, $minutoSaida = 0, DateTime $datePosFinalDeSemana = null)
{
    if ($datePosFinalDeSemana != null) {
        $today = $datePosFinalDeSemana;
    } else {
        $today = new DateTime('now', new DateTimeZone('America/Sao_Paulo'));
        //$today->modify("+3 day");
    } 

    $bool = $this->horarioUtil($today, $prioridadeTempoEmSegundos, $horaSaida, $minutoSaida);

    if ($bool["util"] === true) {
        // Tempo da prioridade permite a resposta no dia atual. 
        return ($bool["conclusao"]); // Retorna Data de Previsão
    } else {
        // Tempo da prioridade NÃO permite a resposta no dia atual.
        if (!$this->finalDeSemana($bool["nextDay"], false)) { // Verifica se proximo dia é final de semana -> CASE false não é final de semana
            $segundosCalculados = $bool["segDiffSaida"];
            return $this->geraDataPrevisaoDeConclusao($segundosCalculados, $horaEntrada, $minutoEntrada, $horaSaida, $minutoSaida, date_time_set($bool["nextDay"], $horaEntrada, $minutoEntrada));
        } else { //                                                                                  -> CASE true é final de semana
            $segundosCalculados = $bool["segDiffSaida"];
            return $this->geraDataPrevisaoDeConclusao($segundosCalculados, $horaEntrada, $minutoEntrada, $horaSaida, $minutoSaida, date_time_set($bool["nextDay"]->modify("next monday"), $horaEntrada, $minutoEntrada));
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文