使用格式日期计算perl日期2012-02-03 00:00:00

问题描述:

我需要一些帮助,在perl中使用日期格式“2012-02-03 00:00:00”计算日期。特别是有没有一种工具可以用来增加日子,并正确切换到月和年?谢谢。使用格式日期计算perl日期2012-02-03 00:00:00

参见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

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

这是所有完全可能使用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