Calculer nombre de minutes d’intervalle entre 2 DateTime

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour.

Je viens demander de l’aide SVP.

Dans une table (une table de réservation en ligne) de ma BDD, j’ai 2 colonnes de type timestamp : 'date_start' et 'date_end’.

Je souhaite calculer le nombre de minutes exact d’intervalle entre ces 2 dates.

Je me suis dans un premier temps créé cette méthode :

public function convertDiffToMinutes($dateStart, $dateEnd): int
{
    $start = new DateTime($dateStart);
    $end = new DateTime($dateEnd);

    $interval = $start->diff($end);

    $yMin = $interval->format("%y") * 525600;  // convertir années en minutes
    $mMin = $interval->format("%m") * 1440 * 31;  // convertir mois (en 31 jours) en minutes
    $dMin = $interval->format("%d") * 1440;  // convertir jours en minutes
    $hMin = $interval->format("%h") * 60;  // convertir heures en minutes
    $iMin = $interval->format("%i");

    return $yMin + $mMin + $dMin + $hMin + $iMin;
}

Mais le problème est surtout de convertir les mois d’intervalle en minutes d’intervalle, vu qu’on ne peut pas savoir à l’avance si les mois enregistrés dans BDD seront un mois à 28 ou à 31 jours… Et les valeurs enregistrés dans 'date_start' et 'date_end' peuvent avoir un mois différent l’une de l’autre, une année différente l’une de l’autre…

Avez-vous une solution propre à me conseiller SVP ?

Merci d’avance.

Édité par stephweb

Sans rien y connaitre au php, passer par les chaines formatées pour les humains, ça me semble douloureux à faire. Je proposerais plutôt de passer par le timestamp, divisé par 60 pour avoir des minutes.

$interval->getTimestamp() / 60

+1 -0

Les mois de 28, 29, 30 ou 31 jours, héhéhé.
Il me semble que tu devrais convertir chaque date en date système (exprimée en millisecondes).
En python, on utilise pour cela datetimes.
Après cela tu fais la différence entre les deux dates converties et tu divises par 60000.

EDIT : vor ici !
https://www.jeromeweb.net/php/5912-dates-en-php

Édité par etherpin

Il se faut s’entraider, c’est la loi de la nature. (Jean de La Fontaine, l’âne et le chien)

+0 -0
Auteur du sujet

Sujet résolu.

Avec ceci ça fonctionne :

/**
 * Retourner nombre de minutes d'intervale entre 2 dates
 */
public static function getMinutesIntervalBetweenTwoDates(string $start, string $end): int
{
    $dateStart = new DateTime($start);
    $dateEnd = new DateTime($end);

    $interval = $dateStart->diff($dateEnd);

    $minutes = $interval->format('%a') * 24 * 60;
    $minutes += $interval->format('%h') * 60;
    $minutes += $interval->format('%i');

    return $minutes;
}

Au lieu de faire ceci : $interval->format(’%a’) On peut aussi faire ceci (sauf que la ça nous retourne un int au lieu d’un string) : $interval->days

Merci à tous pour vos réponses.

J’ajouterais que tu as certainement choisi à peu près la pire des méthodes aux niveaux clarté et performance. Tu fais, un nombre incroyable de conversion entre les chaînes de caractères et des entiers. Heureusement que les types sont annotés car sinon, on serait totalement perdu.

Pourquoi utiliser format alors que c’est possible d’accéder directement aux champs concernés ? Tu parles de $interval->days, mais justement pourquoi ne pas l’utiliser plutôt ? C’est bien plus intéressant et compréhensible. Pourquoi ne pas avoir utiliser les timespams depuis le début si c’est exactement ce que tu veux ?

Édité par ache

ache.one                 🦹         👾                                🦊

+0 -0
Auteur du sujet

Merci pour le conseil. Oui tu as raison, je vais utiliser ce code, c’est mieux en fait :

/**
 * Retourner nombre de minutes d'intervale entre 2 dates
 */
public static function getMinutesIntervalBetweenTwoDates(string $start, string $end): int
{
    $dateStart = new DateTime($start);
    $dateEnd = new DateTime($end);

    $interval = $dateStart->diff($dateEnd);

    $minutes = $interval->days * 24 * 60;
    $minutes += $interval->h * 60;
    $minutes += $interval->i;

    return $minutes;
}

Pourquoi ne pas avoir utiliser les timespams depuis le début si c’est exactement ce que tu veux ?

ache

C’est à dire ? tu parles d’utiliser strtotime au lieu de DateTime et de DateInterval ?

Édité par stephweb

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte