PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 11-05-2009 10:20:59

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Formater une durée à l'origine en seconde

Bonjour à tous,

Voici mon petit problème :
J'ai une durée en seconde : 36655552220011 s
et je voudrais la faire apparaitre de manière formatée :
5y 3m 10d 8h 30min 9s [ce résultat est donné à titre d'exemple, je me suis pas amusé à faire le calcul ^^]

Mon souci c'est que je suis parti sur un algo itératif mais je me rends compte qu'il faudrait en fait en faire un récursif. Mon problème est que la base des calculs de temps change tout le temps : d'abord 60 ensuite 24, 30, 12, 10...

Donc j'avoue que je ne sais pas trop comment aborder le problème pour faire une fonction récursive comme il faut...

Merci d'avance pour les conseils prodigués.

Réponse de MK sur l'ancien Forum

Saluton MasKime,
Il va falloir nous rejoindre sur le nouveau forum :
http://forum.phpdebutant.org/index.php
En attendant, pourquoi ne pas retravailler le résultat d'une fonction date()
<?php
$secondes=36655552220011;
echo date('y m d H i s',$secondes); ?>



La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#2 11-05-2009 10:22:21

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

A la réponse d'MK

date() peut travailler avec un timestamp, il me donne donc bien une date...
Je comprends pas comment est ce que je pourrais retravailler un résultat venant de cette fonction???

Merci de m'éclairer big_smile


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#3 11-05-2009 10:53:56

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Formater une durée à l'origine en seconde

Coucou Max,
Je ne comprends pas ta question à propos du retravail de la fonction date()...
Tu peux agir sur ce résultat comme tout autre...


MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#4 11-05-2009 11:01:19

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

Hello,

Et bien un timestamp est une date en seconde établi à partir de la naissance d'UNIX si mes souvenir sont bons.
Donc si je lui passe une durée en seconde en param il va me retourner une date et non une durée formatée comme je le voudrais:

<?php
echo date('y\y m\m d\d H\h i\m\i\n s\s', 1);
?>

va afficher : 70y 01m 01d 01h 00min 01s
Alors que je voudrais : '01s' tout seul...

Donc en fait ma question était plutot : En quoi est ce que date() peut m'aider à obtenir ce que je veux ^^


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#5 11-05-2009 11:20:03

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

Maskime a écrit :

Alors que je voudrais : '01s' tout seul...^

<?php
echo date('s\s', 1);

Non ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 11-05-2009 11:23:01

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

Sinon, la totale :

<?php
list($ans,$mois,$jours,$heures,$minutes,$secondes)=explode(' ',date('y m d H i s',36655552220011));

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#7 11-05-2009 11:31:19

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

Oui parser le résultat je sais faire ^^

Mais encore une fois il s'agit d'une durée et non d'une date définie par un timestamp.
C'est une fonction qui pourrait être utilisée pour afficher le temps qu'une page à mise à se charger par exemple.
On démarre le chrono au début du script, on l'arrête en fin de script et on obtient un nombre de secondes.
De ce nombre de secondes tu affiche "1min 32s"
Donc à ce niveau je suis capable, mais ma fonction à moi doit pouvoir gérer les années (je me demande si je pourrais pousser le vice jusqu'à la décennie)

Est ce que je suis clair ou est ce que je suis trop con pour comprendre les réponses ? big_smile


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#8 11-05-2009 11:46:15

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

Maskime a écrit :

Est ce que je suis clair ou est ce que je suis trop con pour comprendre les réponses ? big_smile

Parfois, on se demande wink
Qui peut le plus, peut le moins
date attends un timestamp, certes, mais 1 est un timestamp.
Tu as vu que dans mon dernier exemple, j'ai repris ta valeur initiale telle quelle 36655552220011.
Le résultat fourni ne te convient pas ?
Pour mémoire

<?php
echo date('y m d H i s',0);

donne
70 01 01 01 00 00 soit le 1er janvier 1970 à 01h 00:00
Si tu remplaces le 0 par -3600 tu obtiens
70 01 01 00 00 00, donc le 1er janvier 1970 à 00h 00:00
Après, à toi de jouer pour ajuster, mais c'est moins galère que de vouloir tout ré-écrire et ça tient compte des années bissextiles, des heures d'été etc...


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#9 11-05-2009 13:33:13

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

Alors juste à titre informatif.

M'aidant des conseils de MK je me met en quête du timestamp de l'an 0 pour pouvoir faire mes calculs de durées ^^
Donc je me dis, je vais feinter, je vais demander à mktime() de me donner le timestamps de mktime(0,0,0,0,0,0);
De ça il me retourne : 943916400 roll
Ok... et quand j'utilise le formatage de date() fourni par MK j'obtiens le résultat suivant :
99y 11m 30d 00h 00min 00s

Ca doit pas être la bonne manière, je vous tiens au courant quand j'aurais trouvé le timestamp de l'an 0 big_smile

Dernière modification par Maskime (11-05-2009 13:33:58)


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#10 11-05-2009 13:47:56

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

Maskime a écrit :

M'aidant des conseils de MK je me met en quête du timestamp de l'an 0 pour pouvoir faire mes calculs de durées ^^---- je vous tiens au courant quand j'aurais trouvé le timestamp de l'an 0 big_smile

Ça risque d'être long, php ne gère pas les dates antérieures au 1-1-1970, ou très mal, sans compter sur les changements entre calendriers grégoriens et juliens.
A lire, très instructif :http://mutah.free.fr/blog/index.php?200 … -des-dates, même si un peu de baby duck syndrom Python.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#11 11-05-2009 14:02:08

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

Pour ce qui est de la limitation dans date() la première barrière que j'ai rencontré avant le problème de la qualité de la gestion date, c'est la longueur du integer sur une plateforme 32 bits...
Du coup je ne peux pas descendre en dessous de :
01y 12m 13d 20h 55min 13s


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#12 11-05-2009 14:14:36

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

Si tu fais

<?php
$duree=3600*((365*27)+(7*30)+3)+(47*60)+11;
echo date('y\y m\m d\j H\H i\i s\s',$duree);

tu obtiens
71y 02m 24j 13H 47i 11s
tu n'as plus qu'à soustraire membre à membre avec le résultat de date('y\y m\m d\j H\H i\i s\s',0) et tu ne devrais pas être loin de ce que tu cherches à faire, non ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#13 11-05-2009 14:54:27

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

<?php
// approximativement 27 ans 7 mois 3 jours 3 heures 47 minutes 11  secondes
$duree=(3600*(24*((365.25*27)+(7*30.43)+3)))+(47*60)+11;
$durée=explode(' ',date('y m d H i s',$duree));
$début=explode(' ',date('y m d H i s',-3600));
for($i=0;$i<6;$i++){$durée[$i]-=$début[$i];}
?><pre><?php print_r($durée);?></pre>

retourne

Array
(
    [0] => 27
    [1] => 7
    [2] => 3
    [3] => 21
    [4] => 1
    [5] => 35
)

Les écarts sont dus aux arrondis de 365.25 et de 30.43, sinon ça le fait, non ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#14 11-05-2009 15:21:49

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

Je vais faire mon chieur mais ça reste franchement malin.

Le problème est que tes écarts sur les heures les minutes sont tout de même important
Mais du coup je peux penser un algo pour la partie heure/minutes/secondes et prendre le tiens pour la partie année mois jours ^^

Merci


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#15 11-05-2009 15:27:47

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

Maskime a écrit :

Le problème est que tes écarts sur les heures les minutes sont tout de même importants

Mon calcul initial de $durée est bidon, je ne sais pas comment tu vas récupérer ta durée au départ, le but est de la convertir en timestamp, sauf à ce qu'elle y soit nativement.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#16 11-05-2009 15:59:54

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

Ok

Alors après test avec une valeur passée en seconde, j'obtiens en effet des trucs franchement cohérents.

Merci MK ^^


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#17 11-05-2009 16:04:31

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Formater une durée à l'origine en seconde

Ne dankinde.
L'histoire du -3600 doit provenir du fait qu'on est en heure d'été.
Il y a peut-être moyen d'oblitérer ça avec un set php quelconque.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#18 11-05-2009 16:13:09

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : Formater une durée à l'origine en seconde

Ben en fait je me sert déjà du date_default_timezone_set()

Donc pas de souci de ce coté la smile


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

Pied de page des forums