[POO] OBJET CONVERTISSANT UN NOMBRE DE SECONDES EN DIFFÉRENTS FORMATS. (EX : 'A

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 28 oct. 2010 à 00:30
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 1 nov. 2010 à 16:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52423-poo-objet-convertissant-un-nombre-de-secondes-en-differents-formats-ex-a-sem-j-h-min-s

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
1 nov. 2010 à 16:49
Ben oui, c'est parce que peu de scripts utilisent pleinement PHP5.3 que les hébergeurs n'ont aucune raison de se presser de mettre à jour leur version de PHP.
Bien que PHP5.2 soit encore maintenue (corrections de bugs, patches de sécurités, etc), cette banche n'est plus développée. PHP5.3 est stable depuis le 30 juin 2009...
La plupart des hébergeurs (heureusement pas tous) continuent de n'avoir rien à faire de l'avis des utilisateurs...
Une solution pourrait être de quitter son hébergeur PHP5.2 pour aller voir chez la concurrence en expliquant la raison du départ. Mettre à jour son serveur vers PHP5.3 n'est pas quelque chose de franchement compliqué pour un Administrateur Système qui fait son travail.

Cela dit, comme la plupart des utilisateurs continuent d'utiliser des fonctions et une syntaxe de PHP3 (voir l'utilisation abusive des fonction mysql_*), les torts sont relativement partagés.

Continuez donc d'utiliser des technologies qui sont rapidement dépassées, pour ma part, je préfère me tenir à jour de PHP, au moins, comme ça, on peut avancer.
cs_fredhot Messages postés 5 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 20 mai 2014
1 nov. 2010 à 16:20
salut à tous,
pour répondre au 1er post de <<Commentaire de neigedhiver le 28/10/2010 00:30:33>>.
Ben moi quand je fais phpinfo j'ai <>, donc le scrip de 2 lignes et autres fonctions natives de la version 5.3 je peux oublier... pour l'instant.
Donc scrip un peu long mais je ne pourrais pas faire mieux et c'est justement le script qui me manquait pour finaliser une partie d'un projet.
Bonne continuation.
papounet69 Messages postés 2 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 1 novembre 2010
1 nov. 2010 à 16:12
Oui strtotime('1950/10/31') donne bien un résultat !

Mais :
<?php
date_default_timezone_set('Europe/Paris');
echo strtotime('1950/10/31');
?>

Affiche : RIEN !!!
Nota : test réalisé avec PHP 5.2.8
Tout simplement parce que strtotime utilise le timestamp UNIX comme je le signalait dans mon precedent message.
Or je souhaite calculer quelque chose du style :

$diff = strtotime('1656/10/31')-strtotime('1656/10/1');
mais cela ne donne pas le resultat attendu.

Merci tout de même pour ta réponse : tu m'as au moins obligé à relire la doc PHP !
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
1 nov. 2010 à 14:38
Bon d'accord, ça remonte pas avant le 13 décembre 1901 à 20h55 et 13s...

La comparaison de dates n'est absolument pas un problème. Le vrai problème ce sont les intervalles entre deux dates qui doivent prendre en compte les années bissextiles, les années qui devraient l'être mais ne le sont pas (tous les 128 ans), les années qui n'ont jamais existé à cause des changements de calendriers... Ca, c'est une autre affaire.
Mais la comparaison, il suffit d'un petit algorithme pour savoir si une date est antérieure ou postérieure à une autre.
Evidemment, ça ne se fait pas avec des méthodes "modernes", du fait que, justement, les dates ne sont précises que depuis relativement peu de temps.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
1 nov. 2010 à 14:30
@Papounet69 : Et un jour l'informatique a commencé à utiliser des nombres entiers naturels...

<?php
date_default_timezone_set('Europe/Paris');
echo strtotime('1950/10/31');
?>

Affiche : -604976400

C'est beau.
papounet69 Messages postés 2 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 1 novembre 2010
1 nov. 2010 à 11:55
Ceci n'est pas un commentaire direct sur ce code mais plutôt une question :
- Vous travaillez en fait sur la base de dates UNIX qui débutent au 1/1/1970 à 0 h. Ceci est très pratique pour des calculs de dates récentes. Or les généalogistes sont souvent amener à comparer des dates beaucoup plus anciennes ! je ne parle pas des différents calendriers. Je pose donc le problème des comparaisons de dates < 1970 codées dans un calendrier donné (par exemple le calendrier grégorien actuellement utilisé en Europe). Connaissez une libraire (ou des scripts) capables de calculer par exemple la différence entre "20/11/1657" et "12/01/1723" ?
- Connaissez vous des scripts capables de comparer des dates incomplètes ou approchées comme : "20/11/1657" et "4/1654" , "~4/1645" ou (c) 4/1645" ou "> 4/1645" ? C'est un des problèmes rencontrés par les généalogistes qui cherchent à comparer des données.
Merci pour vos idées.
thibautg Messages postés 35 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 4 mai 2010
28 oct. 2010 à 19:10
@neigedhiver : Je suis fondamentalement d'accord sur ton commentaire, et le fait d'utiliser autant que possible les fonctions natives de php. Cependant pour php5.3 je suis vraiment pas d'accord, je dirais plutôt que l'on est peu sous php5.3, déjà que certains hébergeur sont toujours sous php4 avec option php5, n'allons pas trop vite ... Il est de nature que la masse humaine suis souvent l'évolution que avec retard.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
28 oct. 2010 à 17:29
T'as retenu le seul commentaire que je faisais qui était anecdotique... C'est dommage, les autres me paraissaient plus constructifs.
dariumis Messages postés 571 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 18 avril 2018
28 oct. 2010 à 16:35
J'ai rajouté un parametre dans le constructeur, pour dire le nombre de jours que contient une année, comme ça chacun est libre. je voulais mettre deux constructeur mais apparemment ça marche pas. J'ai mis le fichier de teste a 365,2421875 jours/an, comme ça c'est plus précis^^.
dark_nemo Messages postés 16 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 23 septembre 2010
28 oct. 2010 à 15:47
Oui mais 365 jours 5 heures 48 minutes et 45 secondes. C'est une estimation qui a elle aussi une marge d'erreur car la rotation de la terre d'une année sur l'autre n'est pas une elipse parfaite (d'où les hivers et été plus ou moins chaud, ère glacière etc). C'est pour ça que certaine année on rajoute ou retire quelques minutes. La véritable durée d'une année serait celle basée sur l'horloge atomique (faut voir comment est gérer l'heure sur nos serveurs) mais bon c'est chopiter et dans l'absolu t'as raison ^^. D'où la complexité de manipuler les dates soit même.

Enfin pour en revenir à la vrai question qui nous intéresse, je pense qu'une classe héritant de DateTime(http://www.php.net/manual/fr/class.datetime.php) serait peut-être plus juste (je n'ai pas de retour d'expériences de beaucoup de monde dessus, mais moi je n'ai jamais eu de problème avec et ça fonctionne bien)
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
28 oct. 2010 à 13:49
@Dark Nemo : non, une année, c'est 365,2421875 jours, soit 365 jours 5 heures 48 minutes et 45 secondes (c'est la durée la plus scientifiquement exacte, source Wikipedia).
C'est pour ça que les années multiples de 100 ne sont pas bissextiles (et c'est aussi pour ça que tous les siècles n'ont pas forcément le même nombre d'années...)
Mais j'ai comme l'impression de l'avoir déjà écrit. Pardon de me répéter.
dariumis Messages postés 571 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 18 avril 2018
28 oct. 2010 à 12:51
Hey hey!!! Merci pour vos commentaires, ça me fait plaisir d'avoir vos réactions. C'est vrai que je me suis dit qu'une année ne faisait pas 365 jours tout rond, mais c'est vrai que je l'ai mis dans un coin de ma tête, et que sans trop d'efforts j'ai réussi a "l'oublier" lol. Après je pense qu'il suffit de changer la valeurs de tous les 365 du constructeur pour arriver a ce résultat, mais il faudrait que teste, il aurait peut être était bien que je rajoute un paramètre au constructeur permettant d'initialiser le nombre d'année. C'est vrai que ce code parait long, mais c'est parce qu'il y a beaucoup de commentaires, en fait je voulais voir si on pouvait générer la doc avec netbeans, a la manière de la javadoc pour java, mais j'ai pas trouvé ):.

Les fonctions "getJoursDansSemaine" et ses copines sont les fonctions qui a mon sens représente l'intérêt de l'objet, une fois que le nombre de jours arrive a 8 la semaine prend 1, c'est pour dire la durée fait "2 semaine et 6 jours", puis "2 semaine et 7 jours",puis "3 semaine et 0 jours" par exemple. Il y a le fichier de test qui montre bien ça avec les temps au format "j h min s"...

Merci beaucoup pour les infos et d'avoir pris le temps de répondre, dès que j'ai un peu de temps j'essayerais d'améliorer tous ça.
dark_nemo Messages postés 16 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 23 septembre 2010
28 oct. 2010 à 12:26
Salut,
Juste un détail en passant. Une année c'est 365 jours et 6 heures(c'est pour ça qu'il y a le 29 février une fois tout les 4ans).
Bonne continuation
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
28 oct. 2010 à 00:30
Salut,

"* Nombre de jours dans année (365 maxi); "
C'est dommage, la valeur décimale d'une année est 365,242 187 5 jours, soit 365 jours 5 heures 48 minutes 45 secondes

Je suis désolé, je ne vais pas pouvoir faire l'éloge de ton code source, malgré toute la bonne volonté dont tu as fait preuve... Effectivement, on peut faire ça avec des fonctions natives. Mais au contraire de toi, je pense qu'il est préférable d'utiliser des fonctions natives que l'on trouve quand on prend la peine de lire la doc, plutôt que d'exécuter du code aussi long en PHP (forcément moins performant que des fonctions et objéts codés en C).

<?php
date_default_timezone_set('Europe/Paris');
$diff = date_diff(new Date('@0'), new Date('@1288189934'));

echo $diff -> format ('%y années %d jours %h heures %m minutes %s secondes');
?>

Deux choses à propos du code que je propose :
- il ne fonctionne que pour PHP 5.3 et + (mais qui de nos jours utilise encore PHP 5.2 ?)
- il n'est pas totalement juste, puisqu'il part de la date du 1er janvier 1970 à minuit. Mais il n'est pas plus faux que le tien... Au contraire, il montre comment calculer juste, c'est à dire en calculant un nombre de secondes comme étant la différence entre deux dates : autrement, ça n'a pas de sens, tous les mois n'ayant pas le même nombre de jours, toutes les années n'ayant pas le même nombre de jours non plus, et même certains siècles ou millénaires n'ont pas le même nombre d'années... Alors bon...

En d'autres terme, cette fonction est déjà implémentée dans PHP 5.3 de base et de manière plus juste et plus rigoureuse que ce que tu offres avec ta classe. Je dois reconnaître une chose cependant : j'apprécie l'effort que tu as fait dans la présentation de ton code lequel a le gros avantage sur de nombreuses sources publiées ici d'être facilement réutilisable (même si je n'ai pas bien compris le fonctionnement de la méthode getSemainesDansAnnee() et de ses copines qui lui ressemblent).
Rejoignez-nous