Bonjour, j'ai une date au format 'jj/mm/aaaa' et je souhaiterais ajouter 2 mois a cette date. J'aimerais savoir quelle librairie utiliser et comment faire.
Merci.
Version imprimable
Bonjour, j'ai une date au format 'jj/mm/aaaa' et je souhaiterais ajouter 2 mois a cette date. J'aimerais savoir quelle librairie utiliser et comment faire.
Merci.
Tu veux dire incrémenter mm de 2 unités ?
Si oui, une solution (pas optimisée) :
Code:
1
2 $date =~ m/(\d+)\/(\d+)\/(\d+)/; $mois = $2 + 2;
Merci, en fait j'ai fais un truc de ce genre qui ne doit pas non plus etre optimisé:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 use DateTime; $date = '12/11/2006'; $d = substr($date,0,2); $m = substr($date,3,2); $y = substr($date,6,4); my $dt1 = DateTime->new( year => $y, month => $m, day => $d, hour => 0, minute => 0, second => 0, nanosecond => 0, time_zone => "floating", ); $dt1->add(months => 2); $d = substr($dt1,0,4); $m = substr($dt1,5,2); $y = substr($dt1,8,2); print "$d\n"; print "$m\n"; print "$y\n";
Les regex sont plus concises et rapides. A toi de voir.
Oui mais avec ta regex, si tu ajoutes 2 au 12e mois tu obtiens 14 et non 2. Avec DateTime, ca t'evites de te taper ce probleme.
Il suffit de... :
Code:
1
2 $date =~ m/(\d+)\/(\d+)\/(\d+)/; $mois = ($2 + 2) % 12;
Oui mais dans ce cas tu es aussi obligé d'incrémenter ton année. Il faut tout te taper a la main les exceptions: passage de mois d'année,... Je préfère utiliser cette librairie.
Comme tu veux... Sinon
Code:
1
2
3 $date =~ m/(\d+)\/(\d+)\/(\d+)/; $mois = ($2 + 2) % 12; if ($2 > 10) {$an = $3 + 1;}
Les expressions rationnelles de Perl sont excessivement puissantes, et pratiques, mais il faut les utiliser pour ce qu'elles sont : des outils de mise en correspondance et de remplacement.
Elles sont parfaites pour l'extraction des informations "atomiques" de la date (numéro du jour, numéro du mois, année), mais pour l'arithmétique sur les dates, j'aurai plus confiance dans un module, largement testé et répandu, plutôt que dans un calcul que je réaliserai moi-même, avec une gestion des exceptions qui risquerait d'être prise en défaut.
Un 'mix' des deux solutions pourrait être un plus, en fiabilité comme en concision ;)
Bonne journée.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 # Attention, non testé !!! use DateTime; $date = '12/11/2006'; my ($d, $m, $y) = ($date =~ m#(\d+)/(\d+)/(\d+)#); my $dt1 = DateTime->new(year => $y, month => $m, day => $d, hour => 0, minute => 0, second => 0, nanosecond => 0, time_zone => "floating"); $dt1->add(months => 2); # Là, pour l'extraction finale, je ne suis pas sûr de ce que Steph82 réalise ... # Extraction du jour sur 4 positions ??? Et de l'année sur 2 ??? # $d = substr($dt1,0,4); # $m = substr($dt1,5,2); # $y = substr($dt1,8,2); # # J'aurai plutôt fait : my $newdate = $dt1->dmy('/'); ($d, $m, $y) = ($newdate =~ m#(\d+)/(\d+)/(\d+)#; print "$d\n"; print "$m\n"; print "$y\n";
Ca, c'est de la modération... :D
Tout a fait d'accord avec toi :)Citation:
Envoyé par kuzco
Merci 2Eurocents, cette solution je pense est la plus efficace. Pour les
En fait, la date renvoyé est au format américain, c'est pour ca que je commence a partir de 0 et prend 4 caractères pour l'année et non le jour. A la place, je mettrais une autre regex pour récuperer les jours, mois et années de ma date.Code:
1
2
3
4 # Extraction du jour sur 4 positions ??? Et de l'année sur 2 ??? # $d = substr($dt1,0,4); # $m = substr($dt1,5,2); # $y = substr($dt1,8,2);
Encore merci.