2012-10-29 5 views
9

Je travaille sur un script Perl pour ajouter des jours à une date et afficher la newdate:script Perl - ajouter des jours à ce jour pour obtenir une nouvelle date

use Time::ParseDate; 
use Time::CTime; 

my $date = "02/01/2003"; 
my $numdays = 30; 

my $time = parsedate($date); 

# add $numdays worth of seconds 
my $newtime = $time + ($numdays * 24 * 60 * 60); 

my $newdate = strftime("%m/%d/%Y",localtime($newtime)); 

print "$newdate\n"; 

    The output will be: 

    03/03/2003 

Maintenant, comment puis-je configurer l'entrée pour le champ de date aAAAMMJJ Ex: ma $ date = "20030102"

aussi la sortie devra être: 20030303

Merci

+0

Do vous voulez dire yyyyddmm comme le format ou 60 comme le nombre de jours à ajouter? Depuis l'ajout de 30 jours à 20030102 (2 janvier 2003) ne va pas vous arriver à 20030303 (3 mars 2003) – MkV

Répondre

5

Convert $ date du format d'entrée à l'ancien format:

$date =~ s%(....)(..)(..)%$3/$2/$1%; 

Si le format de sortie ne doit pas être %m/%d/%Y, ne le définissez pas. Vous avez évidemment besoin de %Y%m%d.

+0

Grand ... Merci !!! – Gallop

9

Vous pouvez utiliser DateTime + DateTime::Format::Strptime:

#!/usr/bin/perl 
use strict; 

use DateTime; 
use DateTime::Format::Strptime; 

my $strp = DateTime::Format::Strptime->new(
    pattern => '%m/%d/%Y' 
); 

# convert date to 
my $date = '02/01/2003'; 
my $dt = $strp->parse_datetime($date); 
printf "%s -> %s\n", $date, $dt->add(days => 30)->strftime("%d/%m/%Y"); 

SORTIE

02/01/2003 -> 03/03/2003 
8

Vous utilisez Time::Piece + Time::Seconds (dans le noyau depuis Perl 5.10),

use Time::Piece(); 
use Time::Seconds; 
my $date = '20030102'; 
my $numdays = 60; # 30 doesn't get us to march 

my $dt = Time::Piece->strptime($date, '%Y%m%d'); 
$dt += ONE_DAY * $numdays; 
print $dt->strftime('%Y%m%d'); 
Questions connexes