pospos | 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 :
- my %decalage_fuseau = (
- PST => -8,
- MST => -7,
- CST => -6,
- EST => -5,
- AST => -4,
- NST => -3.5,
- );
|
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 :
- 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 :
- ./convert 4:00 CST
- use strict;
- my %decalage_fuseau = (
- PST => -8,
- MST => -7,
- CST => -6,
- EST => -5,
- AST => -4,
- NST => -3.5,
- );
- # on recupere les arguments
- my $heure_min = shift;
- my $fuseau = uc(shift); # on le passe directement en majuscule, au cas ou
- # check l'heure
- if ($heure_min !~ /^\d{1,2}:\d{1,2}$/) {
- die "Premier argument incorrecte: '$heure_min', doit etre une heure de la forme XX:YY\n";
- }
- # check le fuseau
- if (not exists $decalage_fuseau{$fuseau}) {
- die "Deuxieme argument incorrecte: '$fuseau', doit etre un fuseaux parmis ", join(", ", sort keys %decalage_fuseau), "\n";
- }
- # arguments ok
- # on decoupe la date en heures et minutes
- my ($heure, $min) = split(/:/, $heure_min);
- # on converti tout en minutes
- $min += 60*$heure;
- #on soustrait le fuseau (qu'il faut convertir en minutes aussi), pour recuperer l'UTC:
- $min -= 60*$decalage_fuseau{$fuseau};
- # on a converti $fuseau en majuscules pour etre certain
- # si ca sort du cadran on rajoute ou on soustrait 12 heures
- if ($min < 0) {
- # a priori impossible dans ce sens
- $min += 12*60;
- }
- elsif ($min > 12*60) {
- $min -= 12*60;
- }
- # on aurait pu faire ca avec un modulo
- # on recupere les heures et minutes séparées
- $heure = int($min/60);
- $min -= 60*$heure;
- # on affiche le tout:
- printf("%02d:%02d", $heure, $min);
|
Message édité par pospos le 13-03-2004 à 20:05:34
|