如何识别perl中给定日期的格式
我已经开始学习perl,并且遇到了一些问题。那里可能有不同格式的日期可以作为输入。我必须按照时间顺序对这些日期进行排序。
我计划将单日期格式中的每个日期进行转换,并将其作为日期以常见格式(作为关键字)和日期原始给定格式(作为值)存储在散列表中。现在运行排序的散列和输出中的原始格式(散列值)打印日期。如何识别perl中给定日期的格式
但是怎么做呢?我找到了一种将日期转换为另一种格式的格式,如下所示。
use Time::Piece;
my $dt = Time::Piece->strptime('Sep 12 00:00:00 2012', '%b %e %T %Y');
print $dt->strftime('%d-%m-%Y');
但在这种情况下,我必须知道输入日期的格式是什么。在执行时我不知道,因为它取决于用户。那么是否有任何方法可以比较并决定哪种格式是这个日期?
#This is my input file
#only four formats will be there in input dates. (MM/DD/YY,
#DD-MM-YYYY, MMM-DD-YY or DD-MMM-YYYY)
10/01/92
18-07-1984
Oct-20-17
04-Jan-2004
#This is what I want in output
18-07-1984
10/01/92
04-Jan-2004
Oct-20-17
Time::Piece->strptime()
将die()
如果你给它不能使用给定的格式解析日期字符串。但我们可以用eval
要解决这个问题:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Time::Piece;
my @dates = qw[
10/01/92
18-07-1984
Oct-20-17
04-Jan-2004
];
my @fmts = qw[
%m/%d/%y
%d-%m-%Y
%b-%d-%y
%d-%b-%Y
];
foreach (@dates) {
my $tp;
for my $fmt (@fmts) {
eval { $tp = Time::Piece->strptime($_, $fmt) };
last unless [email protected];
}
say $tp;
}
在这段代码中,我们以自己的方式通过的格式列表,直到我们找到一个不die()
。
这会给你一个Time :: Piece对象的日期,你可以存储在某个地方。排序这些对象留给练习读者:-)
注意:您需要确保您的用户将只使用这四种格式的日期。一般来说,这个问题是不可能解决的,因为2000年9月7日输入的意思是2000年9月7日(dd/mm日期比美国之外的mm/dd更常见)。
排序强烈的一个施瓦茨先生的气味。 :) – simbabque
@simbabque我当然在想这些方面。 –
也许''DateTime :: Format :: Natural'](http://search.cpan.org/dist/DateTime-Format-Natural/lib/DateTime/Format/Natural.pm)模块也可能是一种替代方案。我没有自己使用它,但他们宣称所有格式[这里](http://search.cpan.org/~schubiger/DateTime-Format-Natural-1.05/lib/DateTime/Format/Natural/Lang/ EN.pm)会起作用。如果那是真的,那真是太酷了! – PerlDuck
使用正则表达式来区分4种类型的输入。 – toolic