2012-04-08 50 views

回答

8

參見DateTime

#!/usr/bin/env perl 
use strict; use warnings; 

use DateTime; 

my $ts = '2012-02-03 00:00:00'; 
my ($y, $m, $d) = ($ts =~ /([0-9]{4})-([0-9]{2})-([0-9]{2})/); 
my $dt = DateTime->new(year => $y, month => $m, day => $d); 
$dt->add(months => 2, days => 3); 

print $dt->strftime('%Y-%m-%d %H:%M:%S'), "\n"; 

它實際上是一個少許清潔劑使用日期時間::格式類,你會得到錯誤檢查是免費的。

use DateTime::Format::Strptime qw(); 

my $format = DateTime::Format::Strptime->new(
    pattern => '%Y-%m-%d %H:%M:%S', 
    time_zone => 'local', 
    on_error => 'croak', 
); 

my $ts = '2012-02-03 00:00:00'; 
my $dt = $format->parse_datetime($ts); 
$dt->add(months => 2, days => 3); 
print $format->format_datetime($dt), "\n"; 
+0

你也可以看看https://metacpan.org/module/DateTime::Format::MySQL削代碼越往下只是一點點。 – oalders 2012-04-09 01:09:25

+2

我只想用[DateTime :: Format :: Strptime](http://search.cpan.org/dist/DateTime-Format-Strptime/) – runrig 2012-04-09 01:22:08

+1

希望你不要'不介意我添加了Strptime的例子。我修正了原始代碼的輸出;它在日期和時間之間有一個不希望的「T」。 – ikegami 2012-04-09 03:56:54

1

Time::Piece模塊是Perl安裝的標準組成部分,可能做所有你需要的。

該程序使用您的示例日期並添加兩個月和三天,然後再增加400天。顯示所述值的兩個替代方式示

use strict; 
use warnings; 

use Time::Piece; 
use Time::Seconds 'ONE_DAY'; 

my $format = '%Y-%m-%d %H:%M:%S'; 

my $dt = Time::Piece->strptime('2012-02-03 00:00:00', $format); 
$dt = $dt->add_months(2); 
$dt += 3 * ONE_DAY; 

print $dt->strftime($format), "\n"; 

$dt += 400 * ONE_DAY; 

printf "%s %s\n", $dt->ymd, $dt->hms; 

輸出

2012-04-06 00:00:00 
2013-05-11 00:00:00 
+0

這不可能是正確的,因爲一天中的秒數不是恆定的。 – ikegami 2012-04-09 09:46:14

+0

@ikegami它通常是不變的:-)當使用Time :: Piece並添加/減去從截斷到一天的時間開始的日子時,我通常會添加額外的半天,或者減去半天時間當減去,並截斷結果的一天。 – runrig 2012-05-10 20:47:45

1

這是所有完全可能使用POSIX時間處理函數核心內。

標準POSIX::mktime函數已經可以處理非規格化的值,並且可以校正天/月超出範圍。此外,POSIX::strftime實際上在給定值調用它之前格式化它們,所以它會正確調整。

use POSIX qw(strftime mktime); 
use POSIX::strptime qw(strptime); 

my $format = "%Y-%m-%d %H:%M:%S"; 

my @t = strptime("2012-02-03 00:00:00", $format); 
@t = @t[0..5]; # Throw away wday and yday 

$t[3] += 3; # mday 
$t[4] += 2; # mon 

say strftime $format, @t; 

$t[3] += 400; # mday 

say strftime $format, @t; 

給人

2012-04-06 00:00:00 
2013-05-11 00:00:00