Показать элемент, ближайший к текущему времени - PullRequest
0 голосов
/ 20 марта 2019

У меня есть список элементов даты / времени в массиве PHP, которые отформатированы следующим образом:

2019-03-19 00:00:00
2019-03-19 02:30:00
2019-03-19 05:00:00
2019-03-19 14:30:00
2019-03-19 23:59:59

etc.

Я уверен, что это легко, я просто не могу обернуться вокруг него.Какое уравнение я использую, чтобы отобразить элемент, который ближе всего к текущему времени, не переходя.

Так что, если текущее время 22:00:00, я бы хотел отобразить элемент 14:30:00, а не 23:59:59.

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Поскольку ваши времена в Y-m-d H:i:s, вы можете просто сравнить их как строки и использовать простой цикл foreach для получения результата:

$dates = array('2019-03-19 00:00:00',
               '2019-03-19 02:30:00',
               '2019-03-19 05:00:00',
               '2019-03-19 14:30:00',
               '2019-03-19 23:59:59');
$now = date('Y-m-d H:i:s');
$latest = '';
// add sort($dates) here if they are not already sorted.
foreach ($dates as $date) {
    if ($date > $now) break;
    $latest = $date;
}
echo $latest;

Демонстрация на 3v4l.org

Обратите внимание, этот код предполагает, что ваши даты уже отсортированы, если нет, добавьте sort($dates) перед циклом foreach.

0 голосов
/ 20 марта 2019
/**
 * Gets the nearest moment of the same day as $today.
 *
 * @param string[] $dates - A list of dates (needed format: "Y-m-d H:i:s")
 * @param string|null $today - The date used for comparaison. (default is current date)
 * @return string|bool - Returns the nearest date, or false.
 */
function getNearestDate(array $dates, ?string $today = null) {
    if (!$today) {
        $today = date('Y-m-d H:i:s');
    }

    $fnDT = function($d) {
        return DateTime::createFromFormat('Y-m-d H:i:s', $d);
    };

    usort($dates, function($a, $b) use ($fnDT, $today) {
        $da = abs($fnDT($today)->getTimestamp() - $fnDT($a)->getTimestamp());
        $db = abs($fnDT($today)->getTimestamp() - $fnDT($b)->getTimestamp());

        return $da - $db;
    });

    $nearest = $dates[0];

    if ($fnDT($nearest)->format('Y-m-d') !== $fnDT($today)->format('Y-m-d')) {
        print_r('No date of the same day.');
        return false;
    }

    return $nearest;
}

Проверьте это на 3v4l.org

0 голосов
/ 20 марта 2019

Прежде всего конвертируйте все даты в этот формат

$changed_date_1 = date('YmdHis', strtotime($orignaldate_1));
$changed_date_2 = date('YmdHis', strtotime($orignaldate_2));
$changed_date_3 = date('YmdHis', strtotime($orignaldate)_3);

, поэтому 2019-03-19 00:00:00 станет 20190319000000, и так далее, теперь их можно легко сравнивать. чем запустить цикл foreach, в котором перебрать все эти даты

$closestdate= date('Y-m-d H:i:s');//intaily set it to current date
$closest_difference= 99999999999999999;//intaily set a big value, more than 15 digits
foreach($datesArray as $item){
   $difference = $item - date('YmdHis');
   if($difference < $closest_difference){
      $closes_difference = $difference;
      $closestdate = $item;//this item is closest one. in next iteration this may change
   }
}
echo $Closesdate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...