2012-10-29 22 views
9

tôi đang làm việc trên một kịch bản perl để thêm ngày để một ngày và hiển thị newdate:Perl script - thêm ngày để ngày để có được ngày mới

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 

Bây giờ làm thế nào để thiết lập các đầu vào cho các trường ngày được yyyymmdd Ex: $ date của tôi = "20030102"

Ngoài ra sản lượng sẽ cần phải: 20030303

Cảm ơn

+0

Đỗ bạn có nghĩa là yyyyddmm là định dạng hay 60 là số ngày cần thêm? Kể từ khi thêm 30 ngày đến 20030102 (ngày 2 tháng 1 năm 2003) sẽ không đưa bạn đến 20030303 (ngày 3 tháng 3 năm 2003) – MkV

Trả lời

5

Chuyển đổi $ date từ các định dạng đầu vào cho các định dạng cũ:

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

Nếu định dạng đầu ra không được là %m/%d/%Y, thì không đặt nó thành nó. Bạn rõ ràng cần %Y%m%d.

+0

Tuyệt vời ... Cảm ơn! – Gallop

9

Bạn có thể sử dụng 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"); 

OUTPUT

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

Bạn sử dụng Time::Piece + Time::Seconds (trong lõi từ 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'); 
Các vấn đề liên quan