我正在使用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...
}
}
有什么想法吗?看起来很简单,但似乎并没有达到我想要的方式。
答案 0 :(得分:4)
strtotime
受其可以接受的格式限制,并且不会始终提供所需的结果。为了避免日期格式的歧义,如PHP文档所建议,可以使用DateTime::createFromFormat
。这将使您可以强制执行所提供的$_POST['expire']
的所需格式。
使用格式Y-m-d\TH:i|
规则,将强制使用ISO-8601格式,但不包括秒和时区。 |
(管道)将剩余秒数重置为:00
,否则PHP将使用当前秒数。
如果您希望代码在之后运行,则需要比较expire_date < current_date
。
//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.timezone
,php.ini
,date()
和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转换为显示为其他时区。
$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...';
}
}