使用时区检查日期和时间何时过去的问题
Problem in checking when date and time has elapse using timezone
我正在尝试创建一个日期和时间函数来检查给定的日期时间和时区是否已通过,但我的函数始终 returning 为真,即使我输入了未来的日期。
我有下面的例子class
<?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);
}
}
?>
用法
一切都是 returning true,我的期望是 return false
如果基于 timezone
的当前时间尚未过去,或者 return true
时间已过或时间为 now
<?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 class $startTime
中为 false,因为您 DateTime::createFromFormat()
的格式与您作为参数传入的日期格式不匹配并导致它失败。
M d, Y H:i:s
匹配 May 02, 2020 12:00:00
,这不是您传递给 class.
的内容
您应该使用:
$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
的参数是错误的,因此没有正确创建 DateTime。您可以只传递 $startOn
和 DateTimeZone
来创建 DateTime
的实例
我正在尝试创建一个日期和时间函数来检查给定的日期时间和时区是否已通过,但我的函数始终 returning 为真,即使我输入了未来的日期。
我有下面的例子class
<?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);
}
}
?>
用法
一切都是 returning true,我的期望是 return false
如果基于 timezone
的当前时间尚未过去,或者 return true
时间已过或时间为 now
<?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 class $startTime
中为 false,因为您 DateTime::createFromFormat()
的格式与您作为参数传入的日期格式不匹配并导致它失败。
M d, Y H:i:s
匹配 May 02, 2020 12:00:00
,这不是您传递给 class.
您应该使用:
$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
的参数是错误的,因此没有正确创建 DateTime。您可以只传递 $startOn
和 DateTimeZone
来创建 DateTime