1

Bonjour,

Je suis actuellemnt en stage. Il m'a été demandé de faire des contrôle sur le matériel. Le contrôle est fait à partir de la date de mise en service.

Par exemple, un détecteur CO doit être changer tout les 10ans. Et je voudrais faire afficher en rouge lorsqu'il n'est plus valable. Voila ce que j'ai attaqué à faire mais cela ne marche pas.

$typectl= $row_datefin['TYPECONTROLE']; // type : 'DUREE', 'LAVAGE' ou 'AUCUN'
$duree= $row_datefin['DUREEVIETYPE']; // durée de vie : nombre de mois OU nombre de lavage
$datemes=$row_mat['DATEMISESERVICE']; //date de mise en service
$datejour = time();

if($typectl=="DUREE"){

$datemes=$row_mat['DATEMISESERVICE'];
$datemes = mktime(date("m")-2, date("d"), date("y")); //passe la date mise service en seconde et enleve 2mois
$duree=$duree *30*24*60*60;

if($datejour > ($duree+$datemes ))
{
$color="red";
}else
{
$color="black";
}

}

Merci d'avance pour vos réponse.

2

t'es sûr de la syntaxe de ton mktime ? t'as pas peu d'écraser la lecture faite une ligne au dessus
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3

Non je ne suis pas sur. C'est-à-dire pourrais tu m'expliquer s'il te plait

4

Plutôt qu'utiliser les "anciennes" fonctions de date et de temps, je conseille plutôt d'utiliser la classe DateTime (parce que là, tu vas avoir des soucis à retirer 2 mois lorsque le mois est janvier ou février). En effet, cette classe propose des méthodes "propres" (DateTime::add et DateTime::sub) pour faire ça proprement.
(Il y a un équivalent impératif à add et sub, mais c'est super crade à utiliser, donc je conseille vraiment d'utiliser les classes)
avatar

5

Oui mais mon maître de stage souhaite que je développe comme cela. Donc bon je cherche mais je trouve pas.

6

C'est dommage, je suis sûr que s'il te demande ça c'est qu'il ne sait pas qu'il y a de nouvelles extensions ^^ (ou alors il utilise une trèèèès vieille version de PHP).
Sinon, du coup c'est à toi de tester la valeur du mois (tu peux faire ça "à la sauvage", ou de façon plus subtile avec un modulo, je pense), pour être sûre de ne jamais avoir une date inférieure à un (2-2 = 12 ; 1-2=11 ; 12-2=10, etc.).
Ah, et l'ordre des paramètres de mktime est important, et si tu regardes bien la doc, l'ordre est Heures, Minutes, Secondes, Mois, Jour, Année... il faut que tu ajoutes 0, 0, 0 au début de tes paramètres, pour te caler proprement.
avatar

7

En faite c'est qu'il c'est pouvoir s'en reservir apres et comprendre. Mais pourquoi j'ai besoin de tester le mois?
Aurez-tu un exemple s'il te plait?

Merci

8

Ben si tu retires 2 mois à janvier (qui a le numéro 1), tu obtiens quoi, comme mois ?
avatar

9

j'obtient novembre de l'année précédente non

10

C'est pas une question de logique, je crois qu'il te demande de tester ton code cheeky

11

Oui je sais. Mais pourrait tu m'aider car je n'y arrive pas!

12

On ne va pas faire ton algo pour toi. Mais on peut t'expliquer comment faire (méthode simple, mais généralisée à toute soustraction ou tout ajout d'un nombre de mois, comme ça c'est plus facilement paramétrable) :
- Tu récupères le mois en cours avec date('m');
- Tu lui retires le nombre de mois nécessaires (ici, 2)
* Début du test
- Tu testes le nombre trouvé, pour voir s'il est strictement inférieur à 1 ou strictement supérieur à 12 (mois impossibles dans notre calendrier)
- Si c'est le cas, tu corriges :
- Si c'est supérieur à 12, tu soustrais 12 (et, pour faire propre, tu recommences ton test tant que c'est pas bon, parce que si tu as ajouté 15 mois, par exemple, tu auras un problème).
- Si c'est inférieur à 12, tu ajoutes 12 (et, pour faire propre, tu recommences ton test tant que c'est pas bon, parce que si tu as elnevé 15 mois, par exemple, tu auras un problème).
* Fin du test
Tu fais ton mktime avec le nouveau mois calculé

Tu as à présent un bon mois (une autre méthode consiste à travailler avec la division et le reste de la division, mais on va éviter, vu la situation cheeky)
avatar

13

Ok merci. Mais je voulais pas qu'on me fasse l'algo je voulais juste qu'on m'explique c'est tout.

14

Et sinon, je n'ai pas vraiment lu la question, mais est-ce qu'il n'y a pas moyen de convertir en temps Unix et de travailler avec des secondes ?

15

(ou en dates juliennes)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

16

Pen^2 (./14) :
Et sinon, je n'ai pas vraiment lu la question, mais est-ce qu'il n'y a pas moyen de convertir en temps Unix et de travailler avec des secondes ?
Oui, c'est ce que j'aurais fait. Parce que là en plus faut faire attention au nombre de jours dans le mois. Je ne sais pas comment réagit mktime si la date donnée n'existe pas cheeky
avatar

17

Pen^2 (./14) :
Et sinon, je n'ai pas vraiment lu la question, mais est-ce qu'il n'y a pas moyen de convertir en temps Unix et de travailler avec des secondes ?
Ca dépend de ce que tu veux... certaines dispositions légales valent de jour à jour, et non pas sur 30*24*60*60 secondes...
RHJPP (./16) :
Oui, c'est ce que j'aurais fait. Parce que là en plus faut faire attention au nombre de jours dans le mois. Je ne sais pas comment réagit mktime si la date donnée n'existe pas mod.gif
C'est pour ça que j'ai conseillé d'utiliser la classe DateTime, dont les méthodes prennent tout ça automatiquement en charge (j'ai eu à gérer un problème strictement identique il y a deux mois, pour des délais de carence avec des validités de comptes informatiques).
avatar

18

Pen^2 (./14) :
mais est-ce qu'il n'y a pas moyen de convertir en temps Unix et de travailler avec des secondes ?

ça, c'est un coup à rater les années bisextiles, à rater les changements d'heure, à rater les fois où il y a rajout / suppression d'une seconde pour compenser le ralentissement de la rotation de la terre, et plein d'autres cas de ce type.

Si tu es parti pour bosser sur des timestamps unix, tu peux jouer avec strtotime, qui accepte des trucs de ce type :
$timestamp = strtotime('+1 day', $timestamp);
ça sera beaucoup plus safe que de s'amuser à des calculs de secondes.

Sinon, je rejoins Nil : DateTime, c'est le bien.
(attention, certaines méthodes bien utiles genre add() et sub() dont parlait Nil ne sont disponibles qu'à partir de PHP 5.3 ; si jamais tu es sur une vieillerie genre 5.2, tu n'as que modify(), qui accepte le même genre de syntaxe que strtotime)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall