如何识别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 
+1

使用正则表达式来区分4种类型的输入。 – toolic

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更常见)。

+2

排序强烈的一个施瓦茨先生的气味。 :) – simbabque

+0

@simbabque我当然在想这些方面。 –

+0

也许''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