2017-10-18 43 views
2

我已經開始學習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

回答

3

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

相關問題