web-dev-qa-db-fra.com

Avec un timestamp Unix, comment commencer et se terminer?

J'ai un timestamp Unix comme ceci:

$timestamp=1330581600

Comment puis-je obtenir le début et la fin de la journée pour cet horodatage?

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

J'ai essayé ceci:

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

Mais je ne pense pas que cela fonctionnera, car l'horodatage lui-même n'est pas le début exact de la journée.

69
Talon

strtotime peut être utilisé pour couper rapidement les heures/minutes/secondes

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

DateTime peut également être utilisé, bien que nécessitant quelques étapes supplémentaires pour obtenir un horodatage long

$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'),
    )
);
158
rrehbein

Juste 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();

Tout d'abord, un objet DateTime est créé et l'horodatage est défini sur l'horodatage souhaité. Ensuite, l'objet est mis en forme en tant que chaîne définissant l'heure/minute/seconde au début ou à la fin du jour. Enfin, un nouvel objet DateTime est créé à partir de cette chaîne et l'horodatage est récupéré.

Lisible

$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();

Nous pouvons avoir la fin de la journée d'une manière alternative en utilisant cette version plus longue:

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

Fuseau horaire

Le fuseau horaire peut également être défini en ajoutant un indicateur d'horodatage au format tel que O et en spécifiant l'horodatage après la création de l'objet 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();

Flexibilité de DateTime

Nous pouvons également obtenir d'autres informations telles que le début/la fin du mois ou le début/la fin de l'heure en modifiant le second format spécifié. Pour mois: 'Y-m-01 00:00:00' et 'Y-m-t 23:59:59'. Pour heure: 'Y-m-d H:00:00' et 'Y-m-d H:59:59'

En utilisant divers formats en combinaison avec les objets add ()/sub () et DateInterval, nous pouvons obtenir le début ou la fin de toute période, bien que des précautions soient nécessaires pour gérer correctement les années bissextiles.

Liens pertinents

De la PHP docs:

10
Robert Hickman

Vous pouvez utiliser une combinaison de date() et 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() est suffisamment intelligent pour encapsuler des mois/années lorsqu'il est attribué un jour en dehors du mois spécifié (le 32 janvier sera le 1er février, etc.)

5
Cal

Vous pouvez convertir l'heure en données actuelles, puis utiliser la fonction strtotime pour rechercher le début de la journée et simplement y ajouter 24 heures pour déterminer la fin de la journée.

Vous pouvez également utiliser l'opérateur restant (%) pour rechercher le jour le plus proche. Par exemple:

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

Aujourd'hui horodatage de la date de début. Simple

$stamp = mktime(0, 0, 0);
echo date('m-d-Y H:i:s',$stamp);
2
Ganesh
$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = ceil (time() / 86400) * 86400;

Si vous avez besoin des deux valeurs dans le même script. L'une des variables est plus rapide à +/- 86400 secondes que de tirer le sol et le plafond. Par exemple:

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

Pour ceux qui ont cette question à l'avenir:

N'importe quel code de jour

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

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

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

Code du jour actuel

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

$diff = $now - $midnight;
echo $diff;
?>
0
Daniel Bjørnådal