通过使用 PHP 和 FuelPHP 框架比较 2 个日期时间,在 5 分钟后发送电子邮件

Send an email after 5 minutes by comparing 2 datetimes using PHP and FuelPHP framework

我正在使用名为 FuelPhp 的 MVC 框架,我知道这是一个旧框架,但这是应用程序运行的基础。

尝试发送一封比较两个日期时间的电子邮件,因此如果网站已关闭(记录在 $down_time 中)并且已经过去了五分钟(记录在 $last_checked_time 中),那么应该发送一封电子邮件。我遇到的问题是代码似乎停在这一行 $difference = $last_checked_time->diff($down_time); 并且永远不会碰到 if 语句。基本上我想做的就是检查 $last_checked_time 是否比 $down_time 大 5 分钟。没有记录任何错误,所以我不确定问题出在哪里,非常感谢您的帮助。

                    $down_time = DateTime::createFromFormat('Y-m-d H:i:s', $website->down_at);
                    $last_checked_time = DateTime::createFromFormat('Y-m-d H:i:s', $website->last_checked);

                    $difference = $last_checked_time->diff($down_time);

                    if ($difference->format("a") > 0 || $difference->format("h") > 0 || $difference->format("m") >= 5) {

                        Cli::write("Emailing: " . $website->url . " is offline");

                        $notify_emails = array();

                        foreach ($services as $service)
                        {
                            $service_id = $service->service_id;
                            if (in_array($service_id, $dept_emails))
                            {
                                $notify_emails[] = $dept_emails[$service_id];
                            }
                        }

                        $message = "Hi," . $website->url . " has been down since " . $website->down_at . ".";
                        $email = Model_Mail::send_email($dept_emails, "" . $website->url . " is down", $message);

                        $result = DB::update('clients_websites')
                            ->set(array(
                                'down_email_sent' => date('Y-m-d H:i:s')
                            ))
                            ->where('id', '=', $website->id)
                            ->execute();
                    }

调用format时需要在format string前加一个%符号:

if ($difference->format("%a") > 0 || $difference->format("%h") > 0 || $difference->format("%m") >= 5) {

还有,%m是月。如果你想要分钟,你应该使用 %i.

编辑

同样,DateInterval class 可能很烦人,因为您必须检查许多属性,只处理秒数可能更容易:

$diff_in_seconds = $last_checked_time->getTimestamp() - $down_time->getTimestamp();
if($diff_in_seconds >= 300){
    //Do something
}