Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1684 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Script perl qui convertit les fuseaux horaires

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Script perl qui convertit les fuseaux horaires

n°672859
_Faust_
Burn-out général
Posté le 13-03-2004 à 18:19:37  profilanswer
 

Salut,  
 
Je dois écrire un petit script en PERL mais je ne connais vraiment pas ce langage...    
 
Le script doit transformer l?heure donnée vers une heure d?un autre fuseau horaire. Le premier paramètre est l?heure à transformer (format XX :YY où XX est entre 1 et 12, et YY est entre 0 et 59). Et le deuxième paramètre est le fuseau horaire demandé (PST, MST, CST, AST, NST).  
 
Ca serait quoi la meilleure façon de faire ca? Il y a des variables prédéfinies? J'affecte une valeurs à tous les fuseaux horaires? Je fais un if à chaque fuseaux? :heink:  
 

Code :
  1. ./convert.pl 4:00 CST
  2. #!/usr/bin/perl
  3. fuseaux1 = $heure + 1
  4. fuseaux2 = $heure + 2
  5. print " $heure + fuseaux "


 
qq choses comme ca?
 

mood
Publicité
Posté le 13-03-2004 à 18:19:37  profilanswer
 

n°672863
Taz
bisounours-codeur
Posté le 13-03-2004 à 18:24:27  profilanswer
 

les fonctions de temps de perl

n°672866
_Faust_
Burn-out général
Posté le 13-03-2004 à 18:28:20  profilanswer
 

je peux avoir plus de détails svp?

n°672876
Taz
bisounours-codeur
Posté le 13-03-2004 à 18:38:41  profilanswer
 

Time::*

n°672944
pospos
Posté le 13-03-2004 à 20:05:03  profilanswer
 

Si tes entrée sont vraiment un string de type "XX:YY" et un fuseau horaire en string sur trois lettres alors je ne pense pas qu'un module existant poirra t'aider (mais je me trompe peutetre). Par contre c'est assez simple à faire.
 
Je ne sais pas exactement ce que tu veux recuperer en sortie, mais pour tes fuseaux déjà au lieu de faire un switch (ou plutot un if elsif... pasque switch n'existe pas en natif), tu peux utiliser une table de hash:
 

Code :
  1. my %decalage_fuseau = (
  2.   PST => -8,
  3.   MST => -7,
  4.   CST => -6,
  5.   EST => -5,
  6.   AST => -4,
  7.   NST => -3.5,
  8. );


 
ensuite il te suffit de recuperer la valeur de ton fuseau à partir de son nom en passant celui ci comme clé de ta table de hash:
 

Code :
  1. my $decalage = $fuseaux{$argument2}


 
le probleme c'est que le NST est un decalage de 3h30 donc tu ne peux pas simplement decaler les heures, donc faux convertir tout ca en minutes, faire la tembouille, et resortir tout ca (dans quel format? un print à l'ecran?)
 
apres faudrait rajouter qq trucs pour check les arguments au début
 
En gros tu peux faire comme ca:

Code :
  1. ./convert 4:00 CST
  2. use strict;
  3. my %decalage_fuseau = (
  4.   PST => -8,
  5.   MST => -7,
  6.   CST => -6,
  7.   EST => -5,
  8.   AST => -4,
  9.   NST => -3.5,
  10. );
  11. # on recupere les arguments
  12. my $heure_min = shift;
  13. my $fuseau = uc(shift); # on le passe directement en majuscule, au cas ou
  14. # check l'heure
  15. if ($heure_min !~ /^\d{1,2}:\d{1,2}$/) {
  16.   die "Premier argument incorrecte: '$heure_min', doit etre une heure de la forme XX:YY\n";
  17. }
  18. # check le fuseau
  19. if (not exists $decalage_fuseau{$fuseau}) {
  20.   die "Deuxieme argument incorrecte: '$fuseau', doit etre un fuseaux parmis ", join(", ", sort keys %decalage_fuseau), "\n";
  21. }
  22. # arguments ok
  23. # on decoupe la date en heures et minutes
  24. my ($heure, $min) = split(/:/, $heure_min);
  25. # on converti tout en minutes
  26. $min += 60*$heure;
  27. #on soustrait le fuseau (qu'il faut convertir en minutes aussi), pour recuperer l'UTC:
  28. $min -= 60*$decalage_fuseau{$fuseau};
  29. # on a converti $fuseau en majuscules pour etre certain
  30. # si ca sort du cadran on rajoute ou on soustrait 12 heures
  31. if ($min < 0) {
  32.   # a priori impossible dans ce sens
  33.   $min += 12*60;
  34. }
  35. elsif ($min > 12*60) {
  36.   $min -= 12*60;
  37. }
  38. # on aurait pu faire ca avec un modulo
  39. # on recupere les heures et minutes séparées
  40. $heure = int($min/60);
  41. $min -= 60*$heure;
  42. # on affiche le tout:
  43. printf("%02d:%02d", $heure, $min);


Message édité par pospos le 13-03-2004 à 20:05:34
n°672964
_Faust_
Burn-out général
Posté le 13-03-2004 à 20:39:12  profilanswer
 

:ouch:  
 
J'aurai pensé que c'était uniquement quelques lignes (genre 5-6 lignes...)
 
Un gros merci, je vais étudier ca attentivement.
 
Beaucoup de nouveau code, ca ressemble à un mélange de C et de Shell...
 
Encore merci!
 

n°672986
pospos
Posté le 13-03-2004 à 21:24:08  profilanswer
 

ben c'est clair qu'on peut le faire plus court (et toujours clair pour un programmeur Perl), mais vu que tu es debutant en Perl je t'ais fait un truc avec une syntaxe genre C
 
Sinon si tu veux je t'en fais une regexp d'une ligne :D

n°672987
_Faust_
Burn-out général
Posté le 13-03-2004 à 21:25:55  profilanswer
 

regexp? c'est quoi ce truc?

n°672992
pospos
Posté le 13-03-2004 à 21:33:08  profilanswer
 

expression reguliere
ca n'est pas un langage mais un outil specifique à Perl, qui a depuis été rependu dans beaucoup d'autres langages, et qui défini une mini syntaxe permettant de traiter une chaine de caractere de maniere tres concise

n°673007
_Faust_
Burn-out général
Posté le 13-03-2004 à 22:07:36  profilanswer
 

bordel...
 
ca me donne pas les bons résultats puisque je suis au Québec...
 
12:58 devrais me donner 9:58 PST

mood
Publicité
Posté le 13-03-2004 à 22:07:36  profilanswer
 

n°673026
pospos
Posté le 13-03-2004 à 23:17:34  profilanswer
 

ben tu modifie le decalage de fuseau selon tes besoins
 
  my %decalage_fuseau = (  
    PST => -8,  
    MST => -7,  
    CST => -6,  
    EST => -5,  
    AST => -4,  
    NST => -3.5,  
  );  

n°673059
_Faust_
Burn-out général
Posté le 14-03-2004 à 00:45:14  profilanswer
 

Ouai, c'est ce que j'ai fait... par contre, pour avoir le bon résultat par exemple, j'ai mis NST -1.5, mais dans la réalité, il est 1h30 plus tard que chez moi...
 
enfin, ca doit être un détail...

n°673259
pospos
Posté le 14-03-2004 à 16:39:07  profilanswer
 

je comprend pas trop ton histoire?
1.5h ca fait bien 1h30...

n°673276
_Faust_
Burn-out général
Posté le 14-03-2004 à 17:01:10  profilanswer
 

oui! mais de mon fuseau à moi, il est +1.5 en NST et dans le script, j'ai mis -1.5 pour que ca fonctionne...

n°673379
pospos
Posté le 14-03-2004 à 18:39:37  profilanswer
 

c'est normal, c'est le decalage par rapport à UTC (ou a ton crenaux), donc tu de deduit à l'heure donnée: ca se lit à l'envers
 
mais si tu prefere tu peux passer tout en positif et mettre "$min += 60*$decalage_fuseau{$fuseau};"  au lieu de "$min -= 60*$decalage_fuseau{$fuseau};"
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Script perl qui convertit les fuseaux horaires

 

Sujets relatifs
script no robot ?!?MySQL script d'update pour manip sur un tinyblob
Cherche aide sur GD librairie en perlScript NEWS
[Perl] Traitement sur un array à partir de la référence de celui-cifaire un petit script pour defrag mon pc & le couper ?
Perl a des bon jours devant lui ?Script shell / e-mail
[HELP] script panier e-commerce......[Perl] Net::Telnet vers une machine win32
Plus de sujets relatifs à : Script perl qui convertit les fuseaux horaires


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR