Учитывая временную метку Unix, как получить начало и конец этого дня?

у меня есть метка времени Unix, как это:

$timestamp=1330581600

как я могу получить начало дня и конец дня для этой метки времени?

e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day

Я попытался это:

$endOfDay = $timestamp + (60 * 60 * 23);

но я не думаю, что это сработает, потому что сама метка не точное начало дня.

7 ответов


strtotime можно использовать, чтобы быстро отрезать час / минуты / секунды

$beginOfDay = strtotime("midnight", $timestamp);
$endOfDay   = strtotime("tomorrow", $beginOfDay) - 1;

DateTime также можно использовать, хотя требуется несколько дополнительных шагов, чтобы получить от длинной метки времени

$dtNow = new DateTime();
// Set a non-default timezone if needed
$dtNow->setTimezone(new DateTimeZone('Pacific/Chatham'));
$dtNow->setTimestamp($timestamp);

$beginOfDay = clone $dtNow;

// Go to midnight.  ->modify('midnight') does not do this for some reason
$beginOfDay->modify('today');

$endOfDay = clone $beginOfDay;
$endOfDay->modify('tomorrow');
// adjust from the next day to the end of the day, per original question
$endOfDay->modify('1 second ago');

var_dump(
    array(
        'time ' => $dtNow->format('Y-m-d H:i:s e'),
        'start' => $beginOfDay->format('Y-m-d H:i:s e'),
        'end  ' => $endOfDay->format('Y-m-d H:i:s e'),
    )
);

Просто DateTime

$beginOfDay = DateTime::createFromFormat('Y-m-d H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Y-m-d 00:00:00'))->getTimestamp();
$endOfDay = DateTime::createFromFormat('Y-m-d H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Y-m-d 23:59:59'))->getTimestamp();

сначала создается объект DateTime, и метка времени устанавливается в нужную метку времени. Затем объект форматируется в виде строки, устанавливающей час / минуту / секунду до начала или конца дня. Наконец, из этой строки создается новый объект DateTime и извлекается метка времени.

читабельный

$dateTimeObject = new DateTime();
$dateTimeObject->setTimestamp($timestamp);
$beginOfDayString = $dateTimeObject->format('Y-m-d 00:00:00');
$beginOfDayObject = DateTime::createFromFormat('Y-m-d H:i:s', $beginOfDayString);
$beginOfDay = $beginOfDayObject->getTimestamp();

мы можем получить конец дня по-другому, используя это дольше версия:

$endOfDayObject = clone $beginOfDayOject(); // Cloning because add() and sub() modify the object
$endOfDayObject->add(new DateInterval('P1D'))->sub(new DateInterval('PT1S'));
$endOfDay = $endOfDayOject->getTimestamp();

часовой пояс

часовой пояс можно также установить, добавив индикатор метки времени в формат, такой как O и указание метки времени после создания объекта DateTime:

$beginOfDay = DateTime::createFromFormat('Y-m-d H:i:s O', (new DateTime())->setTimezone(new DateTimeZone('America/Los_Angeles'))->setTimestamp($timestamp)->format('Y-m-d 00:00:00 O'))->getTimestamp();

гибкость DateTime

мы также можем получить другую информацию, такую как начало/конец месяца или начало/конец часа, изменив второй указанный формат. За месяц: 'Y-m-01 00:00:00' и 'Y-m-t 23:59:59'. За час: 'Y-m-d H:00:00' и 'Y-m-d H:59:59'

используя различные форматы в сочетании с объектами add()/sub() и DateInterval, мы можем получить начало или конец любого периода, хотя для правильной обработки високосных лет потребуется некоторая осторожность.

Полезные Ссылки

из документов PHP:


вы можете использовать комбинацию date() и mktime():

list($y,$m,$d) = explode('-', date('Y-m-d', $ts));
$start = mktime(0,0,0,$m,$d,$y);
$end = mktime(0,0,0,$m,$d+1,$y);

mktime() достаточно умен, чтобы обернуть месяцы / годы, когда дается день за пределами указанного месяца (январь 32nd будет 1 февраля и т. д.)


вы можете преобразовать время в текущие данные, а затем использовать функцию strtotime, чтобы найти начало дня и просто добавить 24 часа, чтобы найти конец дня.

вы также можете использовать оператор остатка ( % ), чтобы найти ближайший день. Например:

$start_of_day = time() - 86400 + (time() % 86400);
$end_of_day = $start_of_day + 86400;

сегодня дата начала отметка времени. Просто

$stamp = mktime(0, 0, 0);
echo date('m-d-Y H:i:s',$stamp);

для всех, у кого есть этот вопрос в будущем:

любой код дня

<?php
$date = "2015-04-12 09:20:00";

$midnight = strtotime("midnight", strtotime($date));
$now = strtotime($date);

$diff = $now - $midnight;
echo $diff;
?>

код текущего дня

<?php
$midnight = strtotime("midnight");
$now = date('U');

$diff = $now - $midnight;
echo $diff;
?>

$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = ceil (time() / 86400) * 86400;

Если вам нужны оба значения в одном скрипте. Он более быстр к + / - 86400 секунд к одной из переменных чем уволить и пол и ceil. Например:

$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = $start_of_day + 86400;