php - ultima - unix time converter
Dada una marca de tiempo de Unix, ¿cómo llegar al principio y al final de ese día? (7)
Tengo un sello de tiempo de Unix como este:
$timestamp=1330581600
¿Cómo obtengo el comienzo del día y el final del día para esa marca de tiempo?
e.g.
$beginOfDay = Start of Timestamp''s Day
$endOfDay = End of Timestamp''s Day
Intenté esto:
$endOfDay = $timestamp + (60 * 60 * 23);
Pero no creo que funcione porque la marca de tiempo en sí no es el comienzo exacto del día.
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 obtener el final del día de una manera alternativa utilizando 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 también se puede configurar agregando un indicador de marca de hora al formato, como O
y especificando la marca de hora 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 podemos obtener otra información, como el inicio / final del mes o el inicio / final de la hora, cambiando el segundo formato especificado. Para el mes: ''Ym-01 00:00:00''
y ''Ymt 23:59:59''
. Por hora: ''Ymd H:00:00''
e ''Ymd H:59:59''
Usando varios formatos en combinación con los objetos add () / sub () y DateInterval, podemos obtener el comienzo o el final de cualquier período, aunque será necesario tener cuidado para manejar los años bisiestos correctamente.
Enlaces relevantes
De los documentos PHP:
- DateTime
- date con información sobre el formato
- DateTimeZone
- DateInterval
Hoy fecha de inicio fecha y hora. Sencillo
$stamp = mktime(0, 0, 0);
echo date(''m-d-Y H:i:s'',$stamp);
Para cualquier persona que tenga esta pregunta en el futuro:
Código de cualquier día
<?php
$date = "2015-04-12 09:20:00";
$midnight = strtotime("midnight", strtotime($date));
$now = strtotime($date);
$diff = $now - $midnight;
echo $diff;
?>
Código del día actual
<?php
$midnight = strtotime("midnight");
$now = date(''U'');
$diff = $now - $midnight;
echo $diff;
?>
Puede convertir la hora a los datos actuales y luego usar la función strtotime para encontrar el comienzo del día y simplemente agregar 24 horas para encontrar el final del día.
También puede usar el operador restante (%) para encontrar el día más cercano. Por ejemplo:
$start_of_day = time() - 86400 + (time() % 86400);
$end_of_day = $start_of_day + 86400;
Puedes usar una combinación de date()
y 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()
es lo suficientemente inteligente como para envolver meses / años cuando se le da un día fuera del mes especificado (el 32 de enero será el 1 de febrero, etc.)
Strtotime se puede utilizar para cortar rápidamente la hora / minutos / segundos
$beginOfDay = strtotime("midnight", $timestamp);
$endOfDay = strtotime("tomorrow", $beginOfDay) - 1;
DateTime también se puede usar, aunque requiere algunos pasos adicionales para obtener una marca de tiempo prolongada
$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''),
)
);
$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = ceil (time() / 86400) * 86400;
Si necesita ambos valores en el mismo script. Es más rápido para +/- 86400 segundos para una de las variables que disparar tanto el piso como el techo. Por ejemplo:
$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = $start_of_day + 86400;