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.
PHP по умолчанию будет использоватьdate.timezone
, указанное в php.ini
при работе с объектами date()
, time()
, strtotime()
и DateTime
.Это важно только для Wordpress и большинства других приложений, когда отображает даты, сгенерированные вашим приложением для просмотра, или когда принимается строка даты от пользователя, которая должна быть сохранена и отображена для других пользователей.Например, отображение того, когда была создана публикация или когда ожидается событие.В противном случае пользовательское смещение часового пояса, как правило, можно игнорировать, поскольку PHP будет применять собственное смещение часового пояса к проанализированным датам.
Например, PHP по умолчанию date.timezone
- это UTC.Я создаю событие, которое хочу провести в 2019-01-01 09:00
моего времени (EST).Но мероприятие начнется для кого-то в Калифорнии (PST) за 3 часа до 2019-01-01 06:00
.
Чтобы отобразить событие для других пользователей, дату необходимо преобразовать из смещения часового пояса пользователя по 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 по умолчанию.