PHP时间比较失败

时间:2018-12-21 05:01:36

标签: php wordpress date datetime

我正在使用Wordpress插件,并且在时间比较方面遇到问题。我基本上想要的是:如果选择的时间早于当前时间,请执行此操作...但是它不起作用。

如果expire比time()少五个小时,则验证失败。我通过添加gmt偏移量expire来纠正此问题,但是仍然失败。有什么想法吗?

//$_POST['expire'] = '2019-01-31T12:00';

if(validateDate($_POST['expire'])) {
    $expires_epoch = (strtotime($_POST['expire']) - (get_option( 'gmt_offset' ) * HOUR_IN_SECONDS));
    if($expires_epoch < time()) {
        ...do the thing...
    }
 }

有什么想法吗?看起来很简单,但似乎并没有达到我想要的方式。

3 个答案:

答案 0 :(得分:4)

strtotime受其可以接受的格式限制,并且不会始终提供所需的结果。为了避免日期格式的歧义,如PHP文档所建议,可以使用DateTime::createFromFormat。这将使您可以强制执行所提供的$_POST['expire']的所需格式。

使用格式Y-m-d\TH:i|规则,将强制使用ISO-8601格式,但不包括秒和时区。 |(管道)将剩余秒数重置为:00,否则PHP将使用当前秒数。

如果您希望代码在之后运行,则需要比较expire_date < current_date

示例:https://3v4l.org/EelYY

//current date is 2019-01-04 08:33:30
//$_POST['expire'] = '2019-01-04T08:32';

if ($expire_date = \DateTime::createFromFormat('Y-m-d\TH:i|', $_POST['expire'])) {
    $current_date = new \DateTime();
    if ($expire_date < $current_date) {
        /* example purposes only */
        $diff = $expire_date->diff($current_date);
        echo 'Expired ' . $diff->format('%y years %m months %d days %h hours %i minutes %s seconds') . ' ago';
        //do the thing
    }
} else {
    die('Invalid Date Format Provided');
}

结果

Expired 0 years 0 months 0 days 0 hours 1 minutes 30 seconds ago

用于说明如何以及为何使用Wordpress中的时区偏移量。

默认情况下,在使用date.timezonephp.inidate()time()对象时,PHP将使用strtotime()中指定的DateTime。这仅对Wordpress和大多数其他应用程序很重要,当它们向查看器显示应用程序生成的日期时,或者接受要保存并显示给其他用户的用户的日期字符串时。例如显示创建帖子的时间或预计发生事件的时间。否则,用户时区偏移通常可以忽略,因为PHP会将本机时区偏移应用于解析后的日期。

例如,默认的PHP date.timezone是UTC。我创建了一个我想在2019-01-01 09:00时间(美国东部标准时间)发生的事件。但是该活动将在2019-01-01 06:00前3小时在加利福尼亚(PST)的某人开始。

为了向其他用户显示事件,必须将日期从EST的用户时区偏移量转换为UTC并存储在数据库中。然后从UTC转换为显示为其他时区。

示例:https://3v4l.org/vA97A

$defaultTZ = new \DateTimeZone(date_default_timezone_get());
$event_start = '2019-01-01 09:00';
//event starts at 2019-01-01 09:00 EST
$est_date = new \DateTimeImmutable($event_start, new \DateTimeZone('America/New_York'));
//convert to native date to save in database
$utc_date = $est_date->setTimeZone($defaultTZ);
$db_date = $utc_date->format(DATE_ISO8601);

//event starts at 2019-01-01 14:00 UTC
$db_event_start = '2019-01-01T14:00:00+0000';
$event_date = new \DateTimeImmutable($db_event_start, $defaultTZ);

//display the start times to users
$pst_date = $event_date->setTimeZone(new \DateTimeZone('America/Los_Angeles'));
$est_date = $event_date->setTimeZone(new \DateTimeZone('America/New_York'));

echo 'Event Starts at:';
echo $event_date->format('Y-m-d H:i T');
echo $pst_date->format('Y-m-d H:i T');
echo $est_date->format('Y-m-d H:i T');

//display event status
echo 'Event ' . ($event_date <= new \DateTime('now', $defaultTZ) ? 'Has' : 'Not') . ' Started';

结果

Event Starts at:
2019-01-01 14:00 GMT+0000
2019-01-01 06:00 PST
2019-01-01 09:00 EST
Event Has Started
  

对于WordPress,您通常将date_default_timezone_get()替换为   get_option('timezone_string')使用应用程序时区偏移量代替PHP的默认时区偏移量。

答案 1 :(得分:0)

我认为,您计算的gmt_offset错误,对于WordPress,我将进行类似的计算,

$gmt = get_option( 'gmt_offset' );
$expires_epoch = strtotime('midnight') + ((24 - $gmt) * HOUR_IN_SECONDS);
if($expires_epoch < time()){ ... }

这不是确切的解决方案,因为我不知道(strtotime($ _ POST ['expire'])到底是什么?

答案 2 :(得分:0)

我尝试过使用此代码,它对我有用,请检查一下。

    if(validateDate($_POST['expire'])) {
        $expires_epoch = strtotime($_POST['expire']);
        if($expires_epoch < time()) {
            echo '...do the thing...';
        }
     }