2012-10-29 11 views
9

Sto lavorando su uno script perl per aggiungere giorni a una data e visualizzare la NewDate:script Perl - aggiunge giorni per Data per ottenere nuova data

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 

Ora come faccio a impostare l'input per il campo data essere aaaammgg Es: my $ date = "20030102"

anche l'uscita dovrà essere: 20030303

Grazie

+0

Do intendi yyyyddmm come formato o 60 come numero di giorni da aggiungere? Poiché aggiungere 30 giorni al 20030102 (2 gennaio 2003) non ti porterà a 20030303 (3 marzo 2003) – MkV

risposta

5

Converti $ data dal formato di input per il vecchio formato:

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

Se il formato di uscita non deve essere %m/%d/%Y, non impostarlo su di esso. Ovviamente hai bisogno di %Y%m%d.

+0

Grande ... Grazie !!! – Gallop

9

È possibile utilizzare 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"); 

USCITA

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

Si utilizza Time::Piece + Time::Seconds (nel nucleo dal 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');