Проверьте, установлены ли два объекта datetime PHP на одну дату (игнорируя время)
Я просто хочу сравнить 2 объекта datetime, чтобы узнать, установлены ли они на одну дату, но мне не нужен компонент времени объекта. На данный момент я использую команду date_format для извлечения строк, таких как "Y-m-d", но это кажется неудобным.
$firstDate = date_format($firstDateTimeObj, 'Y-m-d');
$secondDate = date_format($secondDateTimeObj, 'Y-m-d');
if !($firstDate == $secondDate) {
// some code
}
Я новичок в программировании и PHP, поэтому любые указатели оценили.
Ответы
Ответ 1
Используйте синтаксис объекта!
$firstDate = $firstDateTimeObj->format('Y-m-d');
$secondDate = $secondDateTimeObj->format('Y-m-d');
Вы были очень близки к выражению if, но! оператор должен находиться в круглой скобке.
if (!($firstDate == $secondDate))
Это также можно выразить как
if ($firstDate != $secondDate)
Ответ 2
Мой первый ответ был совершенно неправильным, поэтому я начинаю новый.
Самый простой способ, как показано в других ответах, - это date_format
. Это почти наверняка путь. Однако есть и другой способ, который использует всю полноту классов DateTime. Используйте diff
для создания экземпляра DateInterval
, а затем проверьте его свойство d
: если оно 0
, это тот же день.
// procedural
$diff = date_diff($firstDateTimeObj, $secondDateTimeObj);
// object-oriented
$diff = $firstDateTimeObj->diff($secondDateTimeObj);
if ($diff->format('%a') === '0') {
// do stuff
} else {
// do other stuff
}
Обратите внимание, что это почти наверняка излишним для этого экземпляра, но это может быть полезным методом, если вы хотите в будущем делать более сложные вещи.
Ответ 3
Я думаю, что ваш подход хорош, но я бы удалил -
, поскольку они ничего не добавляют.
$firstDate = date_format($firstDateTimeObj, 'Ymd');
$secondDate = date_format($secondDateTimeObj, 'Ymd');
if ($firstDate != $secondDate) {
// some code
}
Ответ 4
Это отлично поработало для меня.
$date1=DateTime::createFromFormat('Y-m-d H:i:s', '2014-07-31 07:30:00')->format('Y-m-d');
$date2=DateTime::createFromFormat('Y-m-d H:i:s', '2014-08-01 17:30:00')->format('Y-m-d');
if($date1==$date2){
echo "==";
}else{
echo "!=";
}
Ответ 5
Поиск ответа с той же проблемой. Я пришел к этому решению, которое выглядит лучше для меня, затем использует diff или другие вещи.
Основная проблема - игнорировать временные части объекта DateTime, просто установите его на время, например, в 12:00:00
$firstDateTimeObj->setTime(12, 0, 0);
$secondDateTimeObj->setTime(12, 0, 0);
// The main problem was checking if different.. but you can use any comparison
if ($firstDateTimeObj != $secondDateTimeObj) {
}
Ответ 6
Начиная с PHP 7, вы можете использовать оператор космического корабля <=>
:
$areDatesEqual = ($datetime1 <=> $datetime2) === 0;
Ответ 7
strtotime конвертирует текстовую дату в метку времени Unix: http://fr.php.net/manual/en/function.strtotime.php
$first = strtotime(date_format($firstDateTimeObj, 'Y-m-d'));
$second = strtotime(date_format($secondDateTimeObj, 'Y-m-d'));
if ($first != $second) {
// some code
}
А также:
if ($first > $second) {
// some code
}
if ($first < $second) {
// some code
}
Ответ 8
$first = strtotime(date_format($firstDateTimeObj, 'Y-m-d'));
$second = strtotime(date_format($secondDateTimeObj, 'Y-m-d'));
if ($first != $second) {
// some code
}
Ответ 9
Инициализируйте объект DateTime
и установите время на 00:00:00
. Затем вы можете использовать любое сравнение между датами, игнорирующими время:
$today = \DateTime::createFromFormat('d/m/Y H:i:s', '21/08/2014 00:00:00');
$tomorrow = \DateTime::createFromFormat('d/m/Y H:i:s', '22/08/2014 00:00:00');
// now you can compare them just with dates
var_dump($today < $tomorrow); //true
var_dump($today === $tomorrow); //false
var_dump($today !== $tomorrow); //true
@Evert ответ работает нормально, но похоже, что неправильно преобразовать объект DateTime
в строку, а затем сравнить их.
Ответ 10
Быстро и грязно, можно многократно использовать сколько угодно дат, возможно, все же потребуется некоторая корректировка:
Обновление: менее грязный.
if(sameDate($firstDateTimeObj, $secondDateTimeObj, $ThirdDateTimeObj))
{
// your code
}
function sameDate (DateTime ...$dates) {
foreach($dates as $date)
{
$test[] = $date->format('Ymd');
}
$result = array_unique($test);
if(count($result) == 1)
{
return true;
{
return false;
}