У меня есть следующие
$var = "2010-01-21 00:00:00.0"
Я хотел бы сравнить эту дату с сегодняшней датой (т.е. я хотел бы знать, если это $var
до сегодняшнего дня или равно сегодня или нет)
Какую функцию мне нужно использовать?
У меня есть следующие
$var = "2010-01-21 00:00:00.0"
Я хотел бы сравнить эту дату с сегодняшней датой (т.е. я хотел бы знать, если это $var
до сегодняшнего дня или равно сегодня или нет)
Какую функцию мне нужно использовать?
Ответы:
strtotime($var);
Превращает это в значение времени
time() - strtotime($var);
Дает вам секунды с $var
if((time()-(60*60*24)) < strtotime($var))
Проверим, если $var
был в течение последнего дня.
Этот формат идеально подходит для стандартного сравнения строк, например
if ($date1 > $date2){
//Action
}
Чтобы получить текущую дату в этом формате, просто используйте: date("Y-m-d H:i:s")
.
Так:
$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";
if ($date < $today) {}
В этом прелесть этого формата: он красиво заказывает. Конечно, это может быть менее эффективным, в зависимости от ваших конкретных обстоятельств, но это также может быть намного более удобным и привести к более поддерживаемому коду - нам нужно знать больше, чтобы действительно сделать это суждение суждением.
Для правильного часового пояса вы можете использовать, например,
date_default_timezone_set('America/New_York');
Нажмите здесь, чтобы посмотреть доступные часовые пояса PHP.
mm/dd/yyyy
формат в дату и затем сравнить их. Меня всегда беспокоит, когда у разработчиков есть даты в нескольких часовых поясах в их системе. Я думаю, что лучше хранить даты в вашей системе, всегда в одном часовом поясе, а затем отображать их в любом необходимом часовом поясе. Я начал использовать yyyy-mm-dd
формат (или yyyymmdd
) в 1998 году, когда понял, что он сортируется намного быстрее, даже на SQL-сервере.
Ну вот:
function isToday($time) // midnight second
{
return (strtotime($time) === strtotime('today'));
}
isToday('2010-01-22 00:00:00.0'); // true
Кроме того, еще несколько вспомогательных функций:
function isPast($time)
{
return (strtotime($time) < time());
}
function isFuture($time)
{
return (strtotime($time) > time());
}
if(strtotime('2013-01-22 00:00:00.00') < time()){....}
и это сделал для меня.
Для завершения BoBby Jack, используйте DateTime OBject, если у вас php 5.2.2+:
if(new DateTime() > new DateTime($var)){
// $var is before today so use it
}
Вы можете использовать DateTime
класс:
$past = new DateTime("2010-01-01 00:00:00");
$now = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");
Операторы сравнения работают *:
var_dump($past < $now); // bool(true)
var_dump($future < $now); // bool(false)
var_dump($now == $past); // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future); // bool(false)
var_dump($past > $now); // bool(false)
var_dump($future > $now); // bool(true)
Также возможно получить значения меток времени из объектов DateTime и сравнить их:
var_dump($past ->getTimestamp()); // int(1262286000)
var_dump($now ->getTimestamp()); // int(1431686228)
var_dump($future->getTimestamp()); // int(1577818800)
var_dump($past ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)
* Обратите внимание, что ===
возвращает false при сравнении двух разных объектов DateTime, даже если они представляют одну и ту же дату.
$future
стало прошлым. : P
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');
var_dump(strtotime($today) > strtotime($expiry)); //false or true
$var
равные тоже в OP
Одно предупреждение, основанное на моем опыте, если ваша цель включает только дату, то будьте осторожны, чтобы включить метку времени . Например, скажем, сегодня "2016-11-09"
. Сравнение, включающее метку времени, аннулирует здесь логику. Пример,
// input
$var = "2016-11-09 00:00:00.0";
// check if date is today or in the future
if ( time() <= strtotime($var) )
{
// This seems right, but if it's ONLY date you are after
// then the code might treat $var as past depending on
// the time.
}
Код выше кажется правильным, но если это ТОЛЬКО дата, которую вы хотите сравнить, то приведенный выше код не является правильной логикой. Зачем? Потому что time () и strtotime () будут содержать метку времени. То есть, хотя обе даты приходятся на один и тот же день, разница во времени будет иметь значение. Рассмотрим пример ниже:
// plain date string
$input = "2016-11-09";
Поскольку ввод является строкой с простой датой, использование strtotime()
on $input
предполагает, что это полночь 2016-11-09. Таким образом, бег в time()
любое время после полуночи всегда будет лечить$input
прошлым, даже если они в один и тот же день.
Чтобы это исправить, вы можете просто написать код, например так:
if (date("Y-m-d") <= $input)
{
echo "Input date is equal to or greater than today.";
}
Несколько лет спустя я повторяю наблюдение Бобби Джека, что последние 24 часа не сегодня !!! И я удивлен, что за ответ было столько голосов ...
Для сравнения, если определенная дата меньше, равна или больше другой, сначала вам нужно повернуть их «вниз» к началу дня. Другими словами, убедитесь, что вы говорите об одном и том же времени 00:00:00 в обеих датах. Это может быть просто и элегантно сделано как:
strtotime("today") <=> strtotime($var)
if $var
имеет часть времени в 00:00:00, как указано в OP.
замещать <=>
все, что вам нужно (или оставьте это в php 7)
Кроме того, очевидно, что мы говорим об одном и том же часовом поясе для обоих. Для списка поддерживаемых часовых поясов
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
(пример w3schools, он отлично работает)
Расширяя ответ Джосуа от w3schools:
//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0) {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}
Надеюсь, это поможет. Мой первый пост на stackoverflow!
Сравните объекты даты и времени:
(Я выбрал 10 дней - все, что старше 10 дней, это «СТАРЫЙ», иначе «НОВЫЙ»)
$now = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
echo "OLD! " . $yourdate->format('m/d/Y');
}else{
echo "NEW! " . $yourdate->format('m/d/Y');
}
Некоторые из приведенных ответов не учитывают текущий день!
Вот мое предложение.
$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);
if ($given_date == new \DateTime('today')) {
//today
}
if ($given_date < new \DateTime('today')) {
//past
}
if ($given_date > new \DateTime('today')) {
//future
}
Если вы делаете вещи со временем и датами Carbon - ваш лучший друг;
Установите пакет тогда:
$theDay = Carbon::make("2010-01-21 00:00:00.0");
$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))
lt = меньше чем, gt = больше чем
Как в вопросе:
$theDay->gt(Carbon::today()) ? true : false;
и многое другое;