我试图将字符串转换为dt对象,如下所示:
use DateTime::Format::Strptime qw( );
my $strp = DateTime::Format::Strptime->new(
pattern => '%A%m%d_%Y',
on_error => 'croak',
);
my $string = 'Fri0215_2013';
print $strp->parse_datetime($string)->iso8601(), "\n";
当我运行此操作时,我不断获得Fri02 is not a recognised day in this locale.
我查看了strptime文档,并说本地是strptime
,%A
或{{1}的可选属性}%m%应与月份数匹配,即' 02'和%a% (tried both) should match the abbreviated day name, e.g. 'Fri',
显然会匹配' _' (我希望!),_
将与包括世纪在内的年份相匹配,即“2013”和“#39}”。有人可以帮忙吗?
由于
答案 0 :(得分:2)
DateTime::Format::Strptime
为%a%m%d_%Y
生成的正则表达式为:
/(\w+)([\d ]?\d)([\d ]?\d)_(\d{4})/
其中(\w+)
应该捕获工作日名称。问题是\w
也匹配数字,因此对于字符串Fri0215_2013
,您会得到以下内容:
weekday name: Fri02
month: 1
day: 5
year: 2013
生成工作日名称的正则表达式的代码应该使用您的语言环境的名称列表,但由于错误而退回到\w+
。我提交了bug report,所以希望很快得到解决。 [更新:已在1.55中修复]
解决方法:
$string = s/^(...)(..)(..)_(....)/$1 $2 $3 $4/s;
和
pattern => '%a %m %d %Y'