PHP 中的 DateDiff 导致致命错误:允许的 X 字节内存大小已耗尽(尝试分配 X)
我正在尝试获取 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论