8771 sujets

Développement web côté serveur, CMS

Un petit problème, qui tourne au cauchemar !
Je voudrai ajouter soit 1 jour soit 1 mois soit une année à une date donnée.
J'ai donc exploré date() et mktime, dan le manuel PHP en ligne, et j'ai construit ceci :

	<?php
		$frdate = '19 01 24';
		list($wjour, $wmois, $wannee) = explode(' ', $frdate);
		echo ' jour '.$wjour;
		echo ' mois '.$wmois;
		echo ' annee '.$wannee;
		date(mktime (0, 0, 0, $wmois, $wjour, $wannee));
		// extraction des jour, mois, an de la date
		$an = mktime(0, 0, 0, date("m"), date("d"), date("y")+1);
		$datinv  = date('d m y', $an);
		echo ' datinv '.$datinv;
		$datecle = date('ymd', $an);
		echo ' datecle '.$datecle;
	?>

Mais j'obtiens cela :
jour 19 mois 01 annee 2024 datinv 25 01 25 datecle 250125
les jours ne fonctionnent pas comme je le voudrais !
Même punition pour M+ et J+ :
jour 19 mois 01 annee 2024 datinv 26 01 24 datecle 240126 J+1
jour 19 mois 01 annee 2024 datinv 25 02 24 datecle 240225 M+1
J'ai bien le changement d'année, le changement de mois ET le changement de jour, mais le jour n'est pas juste. On voit bien que le jour de départ est le 19, et on se retrouve avec un jour 25 !
Étonnant, non ?
Mais surtout très embêtant ! (d'habitude, je me sers d'un autre mot ).
J'ai pourtant suivi le manuel pas-à-pas, vérifiant bien mes entrées dans mktime, mm jj aa ...
Rien n'y fait.
Alors, si l'un d'entre vous à une piste, une idée ... je suis preneur.
Merci d'avance
Cordialement
H.
Bonjour,

La variable $an correspond à la date du jour avec un an de décalage :
$an = mktime(0, 0, 0, date("m"), date("d"), date("y")+1); // correspond au 25/01/2025 ce jour

Préfère l'utilisation des classe DateTime et DateTimeImmutable pour gérer les dates en PHP :
<?php

$date = new DateTimeImmutable('2024-01-19');
echo 'jour : ' . $date->format('d') . "\n";
echo 'mois : ' . $date->format('m') . "\n";
echo 'année : ' . $date->format('Y') . "\n";
echo 'heure : ' . $date->format('H:i') . "\n";

$date2 = $date->modify('+1 hour');
echo 'jour : ' . $date2->format('d') . "\n";
echo 'mois : ' . $date2->format('m') . "\n";
echo 'année : ' . $date2->format('Y') . "\n";
echo 'heure : ' . $date2->format('H:i') . "\n";

$date3 = $date->modify('+1 day');
echo 'jour : ' . $date3->format('d') . "\n";
echo 'mois : ' . $date3->format('m') . "\n";
echo 'année : ' . $date3->format('Y') . "\n";
echo 'heure : ' . $date3->format('H:i') . "\n";

Modifié par Pitet (25 Jan 2024 - 12:35)
Salut
en reprenant ton code j'ai fais ça :


    $frdate = '19 01 24';
    list($wjour, $wmois, $wannee) = explode(' ', $frdate);
    
    // Crée un timestamp à partir de la date initiale
    $timestamp = mktime(0, 0, 0, $wmois, $wjour, $wannee);

    // Ajoute 1 an
    $timestamp_an = strtotime('+1 year', $timestamp);
    $datinv_an = date('d m y', $timestamp_an);
    $datecle_an = date('ymd', $timestamp_an);
    echo '1 an plus tard: datinv '.$datinv_an.' datecle '.$datecle_an.'<br>';

    // Ajoute 1 mois
    $timestamp_mois = strtotime('+1 month', $timestamp);
    $datinv_mois = date('d m y', $timestamp_mois);
    $datecle_mois = date('ymd', $timestamp_mois);
    echo '1 mois plus tard: datinv '.$datinv_mois.' datecle '.$datecle_mois.'<br>';

    // Ajoute 1 jour
    $timestamp_jour = strtotime('+1 day', $timestamp);
    $datinv_jour = date('d m y', $timestamp_jour);
    $datecle_jour = date('ymd', $timestamp_jour);
    echo '1 jour plus tard: datinv '.$datinv_jour.' datecle '.$datecle_jour.'<br>';
Modérateur
Salut,

Attention dans l'utilisation de list()

php a écrit :

Note:
Antérieur à PHP 7.1.0, list() fonctionne uniquement sur un tableau d'indice numérique et suppose que l'indice numérique commence à 0.


La destructuration est peut-être plus adaptée maintenant

$person = ['Georges','Michu'];
[$first_name, $last_name] = $person;

var_dump($first_name, $last_name);


@Jencal : +1 Smiley smile
Modifié par niuxe (25 Jan 2024 - 19:44)
Modérateur
Bonjour,

Mes camarades t'ont donné des solutions. Voici quelques explications supplémentaires.
Bzhorace a écrit :
Mais j'obtiens cela :
jour 19 mois 01 annee 2024 datinv 25 01 25 datecle 250125

La raison est que dans ton code tel que tu l'as fait, la variable $an contient la date du jour où tu fais ton test + 1 an ou + 1 mois ou + 1 jour. C'est pourquoi ton jour "19" n'apparait pas dans tes résultats (t'as dû faire ton test le 25 janvier 2024, d'où le 25 qui apparait dans tes résultats).

Il eut fallu ranger la date du 19-01-2024 + 1 an ou + 1 mois ou + 1 jour dans la variable $an, ce que tu ne fais à aucun moment. Pour effectuer cette opération, par exemple avec +1 an, on peut reprendre ton code en le modifiant très légèrement  :
$frdate = '19 01 24';
list($wjour, $wmois, $wannee) = explode(' ', $frdate);
echo ' jour '.$wjour;
echo ' mois '.$wmois;
echo ' annee '.$wannee;
$an = date(mktime (0, 0, 0, $wmois, $wjour, $wannee + 1));
$datinv  = date('d m y', $an);
echo ' datinv '.$datinv;


Amicalement,
Modifié par parsimonhi (26 Jan 2024 - 08:35)
A tous ceux qui se sont penché sur ce problème, merci !
J'ai adopté le code proposé par Jencal, et ça marche comme je le voulais.
Ce post est résolu.
Encore merci et salutations à tous.
H.