Script perl qui convertit les fuseaux horaires

Script perl qui convertit les fuseaux horaires - Perl - Programmation

Marsh Posté le 13-03-2004 à 18:19:37    

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?
 

Reply

Marsh Posté le 13-03-2004 à 18:19:37   

Reply

Marsh Posté le 13-03-2004 à 18:24:27    

les fonctions de temps de perl

Reply

Marsh Posté le 13-03-2004 à 18:28:20    

je peux avoir plus de détails svp?

Reply

Marsh Posté le 13-03-2004 à 18:38:41    

Time::*

Reply

Marsh Posté le 13-03-2004 à 20:05:03    

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
Reply

Marsh Posté le 13-03-2004 à 20:39:12    

: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!
 

Reply

Marsh Posté le 13-03-2004 à 21:24:08    

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

Reply

Marsh Posté le 13-03-2004 à 21:25:55    

regexp? c'est quoi ce truc?

Reply

Marsh Posté le 13-03-2004 à 21:33:08    

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

Reply

Marsh Posté le 13-03-2004 à 22:07:36    

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

Reply

Marsh Posté le 13-03-2004 à 22:07:36   

Reply

Marsh Posté le 13-03-2004 à 23:17:34    

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,  
  );  

Reply

Marsh Posté le 14-03-2004 à 00:45:14    

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...

Reply

Marsh Posté le 14-03-2004 à 16:39:07    

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

Reply

Marsh Posté le 14-03-2004 à 17:01:10    

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...

Reply

Marsh Posté le 14-03-2004 à 18:39:37    

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};"
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed