Just 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();
Primero se crea un objeto DateTime y la marca de tiempo se establece en la marca de tiempo deseada. Luego, el objeto se formatea como una cadena que establece la hora/minuto/segundo al comienzo o al final del día. Por último, se crea un nuevo objeto DateTime a partir de esta cadena y se recupera la marca de tiempo.
legible
$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();
Podemos conseguir el final del día, de manera alternativa el uso de esta versión más larga:
$endOfDayObject = clone $beginOfDayOject(); // Cloning because add() and sub() modify the object
$endOfDayObject->add(new DateInterval('P1D'))->sub(new DateInterval('PT1S'));
$endOfDay = $endOfDayOject->getTimestamp();
Zona horaria
La zona horaria se puede configurar así añadiendo un indicador de marca de tiempo para el formato como O
y especificando la marca de tiempo después de crear el objeto 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();
Flexibilidad de DateTime
También puede obtener otra información, como el inicio/final del mes o el inicio/final de la hora, cambiando el segundo formato especificado. Por mes: 'Y-m-01 00:00:00'
y 'Y-m-t 23:59:59'
. Por horas: 'Y-m-d H:00:00'
y 'Y-m-d H:59:59'
Utilizando diversos formatos en combinación con add()/sub() y objetos DateInterval, podemos conseguir principio o al final de cualquier período, aunque tendrá que ser tomada para manejar los años bisiestos algún tipo de atención correctamente.
Enlaces relevantes
De la documentación de PHP:
Si es GMT, probablemente: $ boundary = floor/ceil ($ timestamp/(60 * 60 * 24)) * (60 * 60 * 24); – hakre
Si su salida esperada es una marca de tiempo como un número entero, hay un simple trazador: $ beginOfDay = mktime (0, 0, 0, date ('n'), date ('j') - 1); $ endOfDay = mktime (0, 0, 0, fecha ('n'), fecha ('j')); – jarederaj