我从html表单中获取02/29/2012
,但从那时起需要使用ISO 2012-02-29
。
我确信使用Perl可以更轻松地完成它,而无需触及我不了解的JS日期选择器。
答案 0 :(得分:5)
$date = '02/29/2012';
$date =~ s#(\d+)/(\d+)/(\d+)#$3-$1-$2#;
答案 1 :(得分:5)
要进行转换,只需使用
即可s{([0-9]{2})/([0-9]{2})/([0-9]{4})}{$3-$2-$1}
但是AFAIK,ISO不是YYYY-DD-MM,而是YYYY-MM-DD。
答案 2 :(得分:2)
您可以使用DateTime或Date::Manip。有很多子程序可以使用日期执行各种操作。例如,使用Date :: Manip:
$string = '02/29/2012';
$date = ParseDate($string);
$out = UnixDate($date, '%Y-%m-%d');
编辑:如我所见,在我输入时提供了类似的答案
答案 3 :(得分:1)
您可以使用Date::Manip::Date模块。
这是一个稍微昂贵,但确认日期。
答案 4 :(得分:1)
使用标准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;
如果你想在Perl中处理日期和时间,那么DateTime及其朋友就是你想要的工具。
答案 5 :(得分:0)
这取决于你将在日期上做多少工作,以及你是否会在文化上意识到不同的人如何输入日期,以及你是否会接受月份名称或缩写以及纯粹的数字,以及......
在CPAN上,Data and Data Types上有一个主要部分,其中包含Date和Time的子部分,每个部分都包含许多模块。有些是非常复杂的:例如,DateTime模块非常彻底,但相当重(并且在日期和时间部分都没有列出)。其他人只是聪明:Date::Calc和Date::Manip。 CPAN的主要问题是财富的尴尬 - 你需要的可能就是那里。
如果其他答案中的简单正则表达式可以使用,请使用它们。否则,请考虑Date :: Calc或Date :: Manip中的一个,除非您找到其他更适合您的东西。
答案 6 :(得分:0)
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";
答案 7 :(得分:0)
由于输入不受信任(网络表单......)我建议基本上使用choroba的答案(添加了边界检查),但是在检查输入是否匹配的测试中:
# 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