2015-07-21 110 views
0

在我的程序中,我有用戶輸入格式爲「月日」(例如5月25日)的日期,如果日期無效,我希望能夠打印錯誤消息(例如2月30日)。檢查日期是否有效

因此,這裏的一些代碼

$start_date = ARGV[0]; 
my $year = DateTime->now->year;           # adds a year to the date 
my $date_parser = DateTime::Format::Strptime->new(pattern => '%Y %B %d', # YYYY Month DD 
); 
my $start_epoch = $date_parser->parse_datetime("$year $start_date")->epoch(); 

權在此之後,我需要某種如果正確說法?

回答

3

如果日期無效,則解析器將返回undef。你會看到這個很快,如果你這樣做:

my $start_date = "Feb 30"; 
my $year = DateTime->now->year;           # adds a year to the date 
my $date_parser = DateTime::Format::Strptime->new(pattern => '%Y %B %d', # YYYY Month DD 
); 
my $start_epoch = $date_parser->parse_datetime("$year $start_date")->epoch(); 

解決辦法:

my $parsed = $date_parser->parse_datetime("$year $start_date"); 
if (not defined $parsed) { print "Error - invalid date\n"; } 
+0

一其他曲這個問題。如果開始日期晚於結束日期,我想添加一個檢查。我不能說'如果(start_epoch> end_epoch)' – user2007843

+2

在這種情況下,你根本不需要比較'epoch'值。例如:'print'早於現在「如果$ parsed < DateTime-> now;' - 您可以直接比較DateTime對象。 – Sobrique

0

perlmonks

use Time::Local; 
my $date = ' 19990230'; # 30th Feb 1999 
$date =~ s/\s+$//; 
$date =~ s/^\s*//; 
my ($year, $month, $day) = unpack "A4 A2 A2", $date; 
eval{ 
    timelocal(0,0,0,$day, $month-1, $year); # dies in case of bad date 
+ 
    1; 
} or print "Bad date: [email protected]"; 

這應該做你正義

+0

'YYYYMMDD'不是OP詢問的格式。 – ThisSuitIsBlackNot

+0

謝謝,真的不知道該怎麼做,以爲我原來的超鏈接@Flexo –

+1

這段代碼有編譯錯誤。 – toolic