Учитывая временную метку 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 docs:
- DateTime
- дата С информацией о формат
- DateTimeZone
- DateInterval
вы можете использовать комбинацию
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()достаточно умен, чтобы обернуть месяцы / годы, когда дается день за пределами указанного месяца (jan 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;
Comments