Bonjour,

J'ai un objet Horaire défini par les champs suivants :
un nom ;
un commentaire (optionnel) ;
une date et heure de début ;
une date et heure de fin ;
un type d'horaire ;
un niveau de priorité (exemple : 0, 1, ou 2) ;
une date de création (définition automatique) ;
une date de dernière modification (définition automatique)

Ce que je veux

Je cherche comment calculer la durée de mon horraire, mais je sais pas comment je dois m'y prendre

voici mon controller :

 #[Route('/horaire', name: 'app_horaire')]
    public function index(Request $request, EntityManagerInterface $entityManager, HoraireRepository $horaireRepository): Response
    {

        // formulaire pour ajouter un nouvel horaire
        $horaire = new Horaire();

        $form = $this->createForm(HoraireType::class, $horaire);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            date_default_timezone_set('Europe/Paris');
            // je récupère la date et l'heure de début et de fin
            $horaire->setCreatedDate(new \DateTime());
            $horaire->setModifiedDate(new \DateTime());

            $entityManager->persist($horaire);
            $entityManager->flush();

            // ... effectuer une action, telle que l'enregistrement de la tâche dans la base de données.
            $this->addFlash('success', 'L\'ajout a bien été pris en compte');

            return $this->redirectToRoute('app_horaire');
        }   

        return $this->render('horaire/index.html.twig', [
            'form_add_horraire' => $form->createView(),
            'horaire' => $horaireRepository->findBy([], ['name' => 'asc']),

        ]);
    }

Merci aux personne qui pourront m'aider.

12 réponses


popotte
Réponse acceptée

Alors oui ça a l'air d'être ça, ensuite ton $interval->format faut l'enregistrer dans une variable pour récupérer le format:

$interval = $horaire->getStartDate()->diff($horaire->getEndDate());
$formated_interval = $interval->format('m/Y');

// Et ensuite tu fais ce que tu veux de ton $formatted_interval, par exemple si la durée tu dois le mettre dans "total date" alors tu fais
$horaire->setTotalDate($formated_date); // Faudra changer le type, une date formatée ce n'est plus un DateTime mais une chaine de caractère (string)

Hello :)

Alors pour avoir la durée tu peux utiliser la fonction diff:

$interval = $horaire->date_de_debut->diff($horaire->date_de_fin); // Et bien sur pour que ça fonctionne faut que ta date de début et de fin soient des DateTime, sinon ça marche pas, la fonction diff elle est dans l'interface DateTime x)

Et pour récupérer la durée tu fais:

$interval->format('Ton format ici');
mary_25
Auteur

Je te remercie pour ton aide, je vais essayer =)

Avec plaisir ^^

mary_25
Auteur

j'ai un joli message d'erreur ^^
Call to undefined method App\Entity\Horaire::diff()
alors je cherche à trouver la solution lol

Mmmmh tu as essayé de faire $horaire->diff($horaire) au lieux de $horaire->date_de_debut->diff($horaire->date_de_fin) ?

Ou alors des dates de debut et de fin ne sont pas des DateTime? Fais un dump de ça: get_class($horaire->date_de_debut)

mary_25
Auteur

j' ai fais ça , mais peut-être que je me suis complétement tromper, j'avoue que je suis un peut perdu la lol
'''
$interval = $horaire->setStartDate(new \DateTime())->diff($horaire->setEndDate(new \DateTime()));
'''

Ah oui x) ta function setStartDate ne retourne pas un DateTime mais le modèle lui même pour faire de la chain je pense x)

Fais voir ton modèle Horaire

mary_25
Auteur

<?php

namespace App\Entity;

use App\Repository\HoraireRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;

[ORM\Entity(repositoryClass: HoraireRepository::class)]

class Horaire
{

[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;

#[ORM\Column(length: 255)]
private ?string $name = null;

#[ORM\Column(length: 999, nullable: true)]
private ?string $comment = null;

#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $startDate = null;

#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $endDate = null;

#[ORM\Column(length: 255)]
private ?string $priority = null;

#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $createdDate = null;

#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $modifiedDate = null;

#[ORM\ManyToOne(inversedBy: 'horaire')]
#[ORM\JoinColumn(nullable: false)]
private ?TypeHoraire $typeHoraire = null;

#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $totalDate = null;

public function getId(): ?int
{
    return $this->id;
}

public function getName(): ?string
{
    return $this->name;
}

public function setName(string $name): self
{
    $this->name = $name;

    return $this;
}

public function getComment(): ?string
{
    return $this->comment;
}

public function setComment(?string $comment): self
{
    $this->comment = $comment;

    return $this;
}

public function getStartDate(): ?\DateTimeInterface
{
    return $this->startDate;
}

public function setStartDate(\DateTimeInterface $startDate): self
{
    $this->startDate = $startDate;

    return $this;
}

public function getEndDate(): ?\DateTimeInterface
{
    return $this->endDate;
}

public function setEndDate(\DateTimeInterface $endDate): self
{
    $this->endDate = $endDate;

    return $this;
}

public function getPriority(): ?string
{
    return $this->priority;
}

public function setPriority(string $priority): self
{
    $this->priority = $priority;

    return $this;
}

public function getCreatedDate(): ?\DateTimeInterface
{
    return $this->createdDate;
}

public function setCreatedDate(\DateTimeInterface $createdDate): self
{
    $this->createdDate = $createdDate;

    return $this;
}

public function getModifiedDate(): ?\DateTimeInterface
{
    return $this->modifiedDate;
}

public function setModifiedDate(\DateTimeInterface $modifiedDate): self
{
    $this->modifiedDate = $modifiedDate;

    return $this;
}

public function getTypeHoraire(): ?TypeHoraire
{
    return $this->typeHoraire;
}

public function setTypeHoraire(?TypeHoraire $typeHoraire): self
{
    $this->typeHoraire = $typeHoraire;

    return $this;
}

public function getTotalDate(): ?\DateTimeInterface
{
    return $this->totalDate;
}

public function setTotalDate(\DateTimeInterface $totalDate): self
{
    $this->totalDate = $totalDate;

    return $this;
}

}

Okay super alors il faut utiliser tes getter au lieux des setter

Esayes ça: $interval = $horaire->getStartDate()->diff($horaire->getEndDate());

Et ça devrait être bon

En gros ce que tu as fais: $interval = $horaire->setStartDate(new \DateTime())->diff($horaire->setEndDate(new \DateTime())); c'est de créer une nouvelle instance de DateTime, donc les deux instances seraient identiques, et en plus les setters retournent bien une instancce Horaire:


public function setStartDate(\DateTimeInterface $startDate): self
{
    $this->startDate = $startDate;

    return $this; // Ici, $this = ton instance Horaire
}
mary_25
Auteur

on est bien d'accord que tu le met dans le if?

'''

[Route('/horaire', name: 'app_horaire')]
public function index(Request $request, EntityManagerInterface $entityManager, HoraireRepository $horaireRepository): Response
{

    // formulaire pour ajouter un nouvel horaire
    $horaire = new Horaire();

    $form = $this->createForm(HoraireType::class, $horaire);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        date_default_timezone_set('Europe/Paris');
        // je récupère la date et l'heure de début et de fin
        $horaire->setCreatedDate(new \DateTime());
        $horaire->setModifiedDate(new \DateTime());

        $horaire->setTotalDate(new \DateTime());

        $interval = $horaire->getStartDate()->diff($horaire->getEndDate());
       $interval->format('m/Y');

        $entityManager->persist($horaire);
        $entityManager->flush();

        // ... effectuer une action, telle que l'enregistrement de la tâche dans la base de données.
        $this->addFlash('success', 'L\'ajout a bien été pris en compte');

        return $this->redirectToRoute('app_horaire');
    }

    return $this->render('horaire/index.html.twig', [
        'form_add_horraire' => $form->createView(),
        'horaire' => $horaireRepository->findBy([], ['name' => 'asc']),

    ]);
}
'''
mary_25
Auteur

d'accord merci beaucoup