obtenir le 1er jour et dernier jour d'un mois

obtenir le 1er jour et dernier jour d'un mois - Perl - Programmation

Marsh Posté le 10-02-2012 à 09:11:16    

Voilà à partir d'une date(date actuelle), je dois déduire le premier et le dernier jour du mois précédent et de même pour le mois actuelle.
 
Exemple 1:
 
Date : 06/08/2012
1er jour du mois M-1 : 01/07/2012
dernier jour du mois M-1 : 31/07/2012
 
Exemple 2:
 
Date : 04/01/2012
1er jour du mois M-1 : 01/12/2011
dernier jour du mois M-1 : 31/12/2011
 
Pour effectuer cette action j'ai choisi le module : Date::Manip  
 
J'ai lu la documentation qu'il y a dessus et j'avoue ne pas tout comprendre  
 
Ai-je fait le bon choix? si oui une piste sur comment obtenir cela ?
 
Je fais d'autres script utilisant ce module histoire d'en voir le plus de points possible.
 
Merci et bonne journée

Reply

Marsh Posté le 10-02-2012 à 09:11:16   

Reply

Marsh Posté le 10-02-2012 à 13:12:51    

Utiliser plutôt Days_in_Month du module Date::Calc
 
mais vous pouvez écrire ça directement aussi, il n'y a absolument rien de compliqué dans cette histoire:
 

Code :
  1. sub firstlastLastMonth {
  2.  my ($day, $month, $year) = split("/", shift);
  3.  unless (--$month) { $month = "12"; --$year;}
  4.  my @nbdays = (31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  5.  if ( 0 == $year % 4 and 0 != $year % 100 or 0 == $year % 400 ) { ++$nbdays[2];}
  6.  return ("01"."/".$month."/".$year, $nbdays[$month]."/".$month."/".$year);
  7. }


 
A+,


Message édité par gilou le 10-02-2012 à 13:51:32

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-02-2012 à 09:04:23    

Bonjour,
 
Désolé de répondre que maintenant, j'ai finalement utilisé le module Time:local pour obtenir les dates que je veux :
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Time::Local;
  5. sub printDate
  6.   {        my ($day, $month, $year) = @_ ;
  7.           print(sprintf("%02s-%02s-%02s\n", ($year+1900,$month+1,$day)));
  8.    }
  9.   # Aujourd'hui ...
  10.   # [3..5] correspondant aux 6 paramètres pris en compte ici : jour,mois,année
  11.   my ($mday,$mon,$year) = (localtime(time))[3..5];
  12. printDate($mday,$mon,$year);
  13. # Le 1er du mois courant ...
  14.   my $first_M = timelocal(0, 0, 0, 1, $mon, $year);
  15.   printDate(1,$mon,$year);
  16. #Dernier jour du mois courant...
  17. #je me place sur le 1er jour du mois suivant
  18.   my $firstMSuivant = timelocal(0,0,0,1,$mon+1,$year);
  19. #par defaut la date est sur minuit, je soustrait de 2h(2*60*60)
  20. #afin d'obtenir le dernier jour du mois courant
  21. my $last_M = $firstMSuivant - 2*60*60;
  22. #le mode de conversion étant en timestamp je convertie en langage humain
  23. ($mday,$mon,$year)=(localtime($last_M))[3..5];
  24. #et j'affiche
  25. printDate($mday,$mon,$year);
  26. #.......................
  27. #.......................
  28. # Le dernier du mois précédent ...
  29. my $last_M_1 = $first_M - 2*60*60; # $first_M = 1er du mois à 0h00 => Au cas où changement d'horaire, soustraire 2h00 suffit
  30. ($mday,$mon,$year) = (localtime($last_M_1))[3..5];
  31. printDate($mday,$mon,$year);
  32. # Le 1er du mois précédent ...
  33. my $first_M_1 = timelocal(0, 0, 0, 1, $mon, $year);
  34. printDate(1,$mon,$year);


 
Ce script est fonctionnel :) merci pour m'avoir mis sur la voie :)
 
Bonne journée.


Message édité par furil le 15-02-2012 à 09:05:31
Reply

Marsh Posté le 15-02-2012 à 15:01:37    

Pour printDate print de sprintf, ça se fait avec printf:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. sub printDate { # (day, month, year) day: 1..31 month: 0..11 year: 0 is 1900
  6.    printf("%02s-%02s-%02s\n", $_[2]+1900, $_[1]+1, $_[0]);
  7. }
  8.  
  9. sub lastday { # (month, year) day: 1..31 month: 0..11 year: 0 is 1900
  10.    my @nbdays = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  11.    # unless février d'une année bissextile on retourne le valeur de nbdays
  12.    return $nbdays[$_[0]] unless  (($_[0]  == 1) and (0 == $_[1] % 4) and ((0 != $_[1] % 100) or (0 == (1900 + $_[1]) % 400)));
  13.    return 29;
  14. }
  15.  
  16. my ($mday, $mon, $year) = (localtime(time))[3..5];
  17.  
  18. # ce jour
  19. printDate($mday, $mon, $year);
  20.  
  21. # premier et dernier jour
  22. printDate(1, $mon, $year);
  23. printDate(lastday($mon, $year), $mon, $year);
  24.  
  25. # recul d'un mois
  26. if ($mon == 0) {
  27.    --$year;
  28.    $mon = 11;
  29. }
  30. else {
  31.    --$mon;
  32. }
  33.  
  34. # premier et dernier jour
  35. printDate(1, $mon, $year);
  36. printDate(lastday($mon, $year), $mon, $year);


 
A+,


Message édité par gilou le 15-02-2012 à 15:02:16

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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