我从一个HTML表单中获取了
02/29/2012
,但之后需要使用ISO格式的2012-02-29
进行操作。
我确定如果不涉及我完全不理解的JS日期选择器,使用Perl会更容易。请注意保留HTML标记。$date = '02/29/2012';
$date =~ s#(\d+)/(\d+)/(\d+)#$3-$1-$2#;
s{([0-9]{2})/([0-9]{2})/([0-9]{4})}{$3-$2-$1}
据我所知,ISO标准日期格式不是YYYY-DD-MM,而是YYYY-MM-DD。
$string = '02/29/2012';
$date = ParseDate($string);
$out = UnixDate($date, '%Y-%m-%d');
使用标准的Perl:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
my $date = '02/09/2012';
say join '-', (split m|/|, $date)[2,1,0];
使用 DateTime:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use DateTime::Format::Strptime;
my $date = '02/09/2012';
my $parser = DateTime::Format::Strptime->new(
pattern => '%d/%m/%Y',
);
my $dt = $parser->parse_datetime($date);
say $dt->ymd;
# input and result are in $_
unless (s{^([0-9]{2})/([0-9]{2})/([0-9]{4})$}{$3-$2-$1}) {
die "invalid input";
}
# From here input is both validated and transformed
这取决于你要在日期上做多少工作,以及你是否会在文化上意识到不同的人如何输入日期,以及是否愿意接受月份名称或缩写以及纯数字等方式。
在CPAN上,有一个关于数据和数据类型的主要部分,其中包括日期和时间的子部分,每个部分都有许多模块。有些非常复杂:例如,DateTime模块非常全面,但比较笨重(并且未列在日期或时间部分中)。其他一些则很巧妙:Date::Calc和Date::Manip。在CPAN的主要问题是太多选择了 - 你需要的东西可能已经存在其中。strptime
函数还可以从核心模块 Time::Piece 中利用:
use Time::Piece;
my $date = q(02/29/2012);
my $t = Time::Piece->strptime( $date, "%m/%d/%Y" );
print $t->ymd, "\n";
\d
匹配任何Unicode数字,而不仅仅是ASCII数字。因此,choroba的答案更安全。 - dolmen