我需要一些关于 perl 中日期计算的帮助,日期格式为“2012-02-03 00:00:00”。特别是有没有一种工具可以用来增加天数并正确切换到月份和年份?谢谢。
问问题
3177 次
3 回答
8
请参阅日期时间。
#!/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";
使用 DateTime::Format 类实际上更简洁一些,并且您可以免费进行错误检查。
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";
于 2012-04-09T00:01:29.467 回答
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
于 2012-04-15T15:20:05.587 回答
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
于 2012-04-09T01:59:14.887 回答