使用时区检查日期和时间何时经过时出现问题



我试图创建一个日期和时间函数来检查给定的日期时间和时区是否通过,但即使我输入了未来的日期,我的函数也总是返回 true。

我在下面有示例类

<?php
class JobTimer{
public function __construct() {
}
public function isDateTime($startOn, $timezone = "GMT"){
$nowTime = new DateTime("NOW", new DateTimeZone($timezone));    
$startTime = DateTime::createFromFormat('M d, Y H:i:s', $startOn, new DateTimeZone($timezone));
return ($nowTime >= $startTime ? true : false);
}
}
?>

用法 一切都返回为真,我的期望是如果基于timezone的当前时间尚未过去,则返回false,或者在时间流逝或时间now时返回true

<?php
$job = new JobTimer();
//if($job->isDateTime("2019-05-02 12:00AM", "Asia/Kuala_Lumpur")){
//if($job->isDateTime("2021-05-02 12:00AM", "Asia/Kuala_Lumpur")){
if($job->isDateTime("2020-05-02 12:00AM", "Asia/Kuala_Lumpur")){
echo "YES";
}else{
echo "NO";
}
?>

在 JobTimer 类中,$startTime为 false,因为DateTime::createFromFormat()的格式与您作为参数传入的日期格式不匹配,并导致其失败。

M d, Y H:i:s匹配May 02, 2020 12:00:00这不是您传递给该类的内容。

您应该使用:

$startTime = DateTime::createFromFormat('Y-m-d H:iA', $startOn, new DateTimeZone($timezone));

工作代码:

class JobTimer{
public function __construct() {
}
public function isDateTime($startOn, $timezone = "GMT"){
$nowTime = new DateTime("NOW", new DateTimeZone($timezone));
$startTime = DateTime::createFromFormat('Y-m-d H:iA', $startOn, new DateTimeZone($timezone));
return $nowTime >= $startTime;
}
}

$job = new JobTimer();
if($job->isDateTime("2020-05-02 12:00AM", "Asia/Kuala_Lumpur")){
echo "YES";
}else{
echo "NO";
}

输出:

NO

演示

将函数更改为:

public function isDateTime($startOn, $timezone = "GMT"){
$nowTime = new DateTime("NOW", new DateTimeZone($timezone));    
$startTime = new DateTime($startOn, new DateTimeZone($timezone));
return ($nowTime >= $startTime ? true : false);
}

您传递给createFromFormat的参数是错误的,因此没有正确创建日期时间。您只需传递$startOnDateTimeZone即可创建DateTime实例