Не удалось сопоставить дату и время с использованием PHP - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно сопоставить (= или>) дату с сегодняшней датой, а текущий час - с определенным пользователем значением с использованием PHP. Я объясняю мой код ниже.

<?php
$cdate='2018-08-27 00:00:00';
$today=date("Y-m-d h:i:s");
$cdate1=strtotime($cdate);
$today1=strtotime($today1);
if ($today1 > $cdate1) {
    echo 'greater day';
}else{
    echo 'lesser day';
}
?>

Приведенный выше код не работает должным образом. Вот мое требование, чтобы сравнить

1) сегодняшняя дата равна или превышает указанную дату

2) определенный час равен определенному пользователем часу.

Ответы [ 6 ]

0 голосов
/ 29 августа 2018

Вам на самом деле не нужна функция для этого, она просто для того, чтобы сделать тест более одного раза:

function compareDate($cdate){
    $today=date("Y-m-d h:i:s");
    $cdate=array_chunk(date_parse($cdate),3,true);//use date parse to handle any valid date format
    $today=array_chunk(date_parse($today),3,true);
    $cday=join('-',$cdate[0]);//get only the day without the time
    $thisday=join('-',$today[0]);
    $cHour=$cdate[1]['hour'];//get only the hour as it is the OP requirement
    $thishour=$today[1]['hour'];
    if ($thisday > $cday)
    {
        echo '<br>greater day<br>';
    }
    elseif($thisday == $cday)//if this day == user defined date compare only Hour then
    {
        echo '<br>same day<br>';
        if ($thishour > $cHour)
        {
            echo '<br>greater hour<br>';
        }
        elseif($thishour == $cHour)
        {
            echo '<br>same hour<br>';
        }else
        {
            echo '<br>lesser hour<br>';
        }
    }
    else
    {
        echo '<br>lesser day<br>';
    }
}
compareDate('2018-08-27 00:00:00');

выход:

greater day

тогда

compareDate(date("Y-m-d h:i:s"));

выход: * +1010 *

same day 
same hour
0 голосов
/ 29 августа 2018
  • Первая проблема уже упоминалась несколько раз: $ today1 не определено
  • Вторая проблема - использовать h в формате времени: он никогда не сработает таким образом
  • Кроме того, с таким форматом даты, как тот, который вы используете, который хорошо упорядочен, порядок сравнения строк идентичен хронологическому порядку. Так что нет необходимости конвертировать в объект времени.

Эта версия, конечно, сравнивает не только часы, но также минуты и секунды, если это проблема, просто обрежьте строки.

<?php
$cdate='2018-08-29 10:00:00';
$today=date("Y-m-d H:i:s");

if ($today > $cdate) {
    echo 'greater day';
} else {
    echo 'lesser day';
}
?>
0 голосов
/ 29 августа 2018

Почему бы не сделать это проще, используя DateTime объекты ?

Дополнительно: Относительные условия для strtotime, DateTime и date_create.

Я быстро создал несколько примеров с некоторыми комментариями для вас.

<?php

$today = new DateTime('today'); // comes with today's date and 00:00:00 for time
$now = new DateTime('now');     // comes with today's date and current time

if ($now > $today) {
    echo 'Now is later than the day\'s start... <br />';
}

echo  '<hr />';

$testDates = [
    '2018-08-07',
    '2018-08-31',
];

// Compare with "now" -> ignores time
foreach ($testDates as $testDate) {
    // Create new DateTime based on given string and sets time to 00:00:00
    $testDate = (new DateTime($testDate))->setTime(0, 0, 0);

    if ($testDate > $today) {
        echo 'Test date "' . $testDate->format('Y-m-d') . '" is greater than today: ' . $today->format('Y-m-d') . '<br />';
    }
}

echo  '<hr />';

$testDatesWithTime = [
    '2018-08-07 12:33:33',
    '2018-08-29 08:00:00', // Today - has already been
    '2018-08-29 22:00:00', // Today - is yet to come
    '2018-08-30 22:00:00',
];

// Compare with "now" -> take time into account
foreach ($testDatesWithTime as $testDate) {
    // Create new DateTime based on given string and sets time
    $testDate = new DateTime($testDate);

    if ($testDate > $now) {
        echo 'Test date "' . $testDate->format('Y-m-d H:i:s') . '" is greater than today: ' . $now->format('Y-m-d H:i:s') . '<br />';
    }
}

Выход сверху:

Now is later than the day's start... 

Test date "2018-08-31" is greater than today: 2018-08-29

Test date "2018-08-29 22:00:00" is greater than today: 2018-08-29 09:55:06
Test date "2018-08-30 22:00:00" is greater than today: 2018-08-29 09:55:06
0 голосов
/ 29 августа 2018

Существует проблема

$today1=strtotime($today1); 

$ today1 не является определяемой переменной, поэтому измените ее следующим образом

$today1=strtotime($today); 

тогда это работает.

0 голосов
/ 29 августа 2018

Примерно так будет работать

<?php
    echo var_dump($date = getdate());
      if($date['year'] >= $user_year_value && $date['mon'] >= $user_month_value && $date['mday'] >= $user_day_value){
          //** Do something. DOn't forget to set timezone */
      }

?>

SQL может сделать это и для вас GETDATE (); также даст вам час и минуты.

Но на самом деле SQL выполняет свою работу, если вы планируете использовать его для встреч или событий.

0 голосов
/ 29 августа 2018

Вы можете использовать DateTime :: createFromFormat для сравнения даты и времени.

Попытка:

date_default_timezone_set('UTC'); // It is important to set same timezone as the input date for comparison

$currentDateTime = new DateTime(); // current DateTime object

$cdate='2018-08-29 07:50:59'; // input date
$cdateFormat = 'Y-m-d H:i:s'; // input date format

$cdateDateTime = DateTime::createFromFormat($cdateFormat, $cdate);

$dateFormat = 'Y-m-d'; //only date format
$cdateOnlyDate = $cdateDateTime->format($dateFormat);
$currentDateTimeOnlyDate = $currentDateTime->format($dateFormat);


if ($currentDateTimeOnlyDate < $cdateOnlyDate) {
    echo "lesser date";
} elseif ($currentDateTimeOnlyDate > $cdateOnlyDate) {
    echo "greater date";
} else {
    echo "same date ";

    $timeFormat = 'H:i:s'; //only time format
    $currentDateTimeOnlyTime = $currentDateTime->format($timeFormat);
    $cdateOnlyTime = $cdateDateTime->format($timeFormat);
    echo "<br /> Check the var_dump below to ensure correct time w.r.t timezone<br />";
    var_dump($currentDateTimeOnlyTime, $cdateOnlyTime);
    echo "<br />";
    if ($currentDateTimeOnlyTime < $cdateOnlyTime) {
        echo "lesser time";
    } elseif ($currentDateTimeOnlyTime > $cdateOnlyTime) {
        echo "greater time";
    } else {
        echo "same time ";
    }
}

Выход: https://3v4l.org/Oe6b3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...