Desafortunadamente, la respuesta aceptada se rompe debido a un error de php que ocurre en escenarios muy específicos. Discutiré esos escenarios, pero primero la respuesta usando DateTime. La única diferencia entre esto y la respuesta aceptada ocurre después de la // IMPORTANT
línea:
$dtNow = new DateTime();
$dtNow->setTimezone(new DateTimeZone('America/Havana'));
$dtNow->setTimestamp($timestamp);
$beginOfDay = clone $dtNow;
$beginOfDay->modify('today');
$endOfDay = clone $beginOfDay;
$endOfDay->modify('tomorrow');
$ts = $endOfDay->getTimestamp();
$tsEndOfDay = $ts - 1;
$endOfDay->setTimestamp($tsEndOfDay);
Por lo tanto, notará que en lugar de usar ->modify('1 second ago');
, obtenemos la marca de tiempo y restamos una. La respuesta aceptada usando modify
debería funcionar, pero se rompe debido a un error de php en escenarios muy específicos. Este error ocurre en zonas horarias que cambian el horario de verano a la medianoche, el día del año en que los relojes se adelantan. Aquí hay un ejemplo que puede usar para verificar ese error.
código de error de ejemplo
$timezone = 'America/Santiago';
$dateString = "2020-09-05";
echo 'the start of the day:<br>';
$dtStartOfDay = clone $dtToday;
$dtStartOfDay->modify('today');
echo $dtStartOfDay->format('Y-m-d H:i:s');
echo ', '.$dtStartOfDay->getTimestamp();
echo '<br><br>the start of the *next* day:<br>';
$dtEndOfDay = clone $dtToday;
$dtEndOfDay->modify('tomorrow');
echo $dtEndOfDay->format('Y-m-d H:i:s');
echo ', '.$dtEndOfDay->getTimestamp();
echo '<br><br>the end of the day, this is incorrect. notice that with ->modify("-1 second") the second does not decrement the timestamp by 1:<br>';
$dtEndOfDayMinusOne = clone $dtEndOfDay;
$dtEndOfDayMinusOne->modify('1 second ago');
echo $dtEndOfDayMinusOne->format('Y-m-d H:i:s');
echo ', '.$dtEndOfDayMinusOne->getTimestamp();
echo '<br><br>the end of the day, this is correct:<br>';
$dtx = clone $dtEndOfDay;
$tsx = $dtx->getTimestamp() - 1;
$dty = clone $dtEndOfDay;
$dty->setTimestamp($tsx);
echo $dty->format('Y-m-d H:i:s');
echo ', '.$tsx;
salida de código de ejemplo de error
the start of the day:
2020-03-26 00:00:00, 1585173600
the start of the *next* day:
2020-03-27 01:00:00, 1585260000
the end of the day, this is incorrect. notice that with ->modify("1 second ago") the
second does not decrement the timestamp by 1:
2020-03-27 01:59:59, 1585263599
the end of the day, this is correct:
2020-03-26 23:59:59, 1585259999