Круглый день в последний час

Я пытался найти это, но я не мог найти хороший пример этого, что я пытаюсь сделать.

Я получил значения datetime в базе данных MySQL, которые нужно округлить, когда это значение используется.

Пример: все эти значения:

2013-04-20 07:14:42
2013-04-20 07:19:51
2013-04-20 07:37:26
2013-04-20 07:46:28
2013-04-20 07:59:44

Следует округлить до:

2013-04-20 07:00:00

А также

2013-04-20 16:25:34

должно быть:

2013-04-20 16:00:00 и т.д....

PHP-код, который получает значение даты:

$d = strtotime($row["date"]);

Итак, как можно округлить значение datetime?

Ответ 2

Если вы используете библиотеку PHP Carbon DateTime (которая вам действительно нужна - https://github.com/briannesbitt/Carbon)

Вы можете легко достичь этого

Carbon::now()->minute(0)->second(0);

Ответ 3

Поскольку у вас уже есть отметка времени $d Unix, наиболее эффективным способом является использование только арифметических функций вместо функций даты, особенно если вы собираетесь перебирать результирующий набор.

$hourTimestamp = $d - ($d % 3600);

Оператор Modulo дает вам остаток, который вы вычитаете из метки времени, чтобы получить метку времени в часах.

Ответ 4

strtotime() дает вам strtotime() метку Unix, которая представляет собой количество секунд с 1970-01-01 00:00:00.

Что, если просто делить на 3600 секунд (секунды эквивалентны 1 часу) и игнорировать остатки (минуты и секунды, которые вы хотите)?

$d = strtotime($row["date"]);
$rounded_d = intval($d / 3600);
$formatted_rounded_d = date('Y-m-d H:i:s', $rounded_d)

Ответ 5

вы можете использовать функцию функции date и strtotime для достижения этого, просто уже измените свои минуты и вторую гармонию

    $date = '2013-04-20 07:14:42';
    $newdate = date('Y-m-d H:00:00', strtotime($date));

    echo $newdate;

это выведет

2013-04-20 07:00:00

Ответ 6

Это записывает дату в строку, выводя непосредственно 00:00 виде минут и секунд вместо записи i:s:

$date = date("Y-m-d H:00:00", $d);

Или вам это нужно как unix timestamp? Затем сократите минуты и секунды (всегда последние 5 байтов) и замените их на 00:00.

$d = strtotime(substr($row["date"], 0, -5)."00:00"));

Ответ 7

В этом случае простой substr мог бы сделать:

echo substr($date, 0, 13) . ":00:00";

Ответ 8

Для тех, кто следует (намного позже!): У углерода есть простой способ сделать это

$date = (new Carbon($row['date']))->minute(0)->second(0)->getTimestamp();

Ответ 9

Я бы использовал метод DateTime setTime() в такой функции.

<?php

/**
 * @param \DateTime $dateTime
 *
 * @return \DateTime
 */
function roundDownToHour(\DateTime $dateTime)
{
    $dt = $dateTime; // clone

    return $dt->setTime(
        $dateTime->format("H"),
        0,
        0
    );
}

$testDate = date("Y-m-d H:i:s", mktime(9, 59, 59, 1, 30, 2019));
$roundedDownToHour = roundDownToHour(new \DateTime($testDate));

var_dump($testDate); //=> 2019-01-30 9:59:59
var_dump($roundedDownToHour->format("Y-m-d H:i:s")); //=> 2019-01-30 09:00:00

Что приводит к следующему.

// the results
string(19) "2019-01-30 09:59:59"
string(19) "2019-01-30 09:00:00"