When validating dates, sometimes it's easiest to just let people type whatever they want and have your code try to make sense of it. Of course if you can constrain people to specific formats, that's even easier, but that's not always an option - your input may be coming from multiple sources where different rules or expectations are in effect.
Date::Manip is one of the most forgiving and accepting Perl modules. You can throw just about anything at it and get back a formatted date.
Before you rush to CPAN to get this, you might want to know that this module does a LOT of tests. I really recommend using "notest install Date::Manip" with cpan - if you don't, you'll be watching tests for quite a while..
Once you have it, it's simple to use. The script that follows just loops on input and reformats whatever you type into mm/dd/yy format. It also makes sure that you've typed something in the future (just to demonstrate how to convert to Epoch seconds).
#!/usr/bin/perl use Date::Manip qw(ParseDate UnixDate ); $x=time(); print "Epoch seconds $x\n"; while (<>) { $date=ParseDate($_); print "ooops - don't understand!\n" if not $date; next if not $date; ($y,$m,$d)=UnixDate($date, "%Y", "%m", "%d"); ($e)=UnixDate($date, "%o"); if ($e < $x) { print "Can't accept $m/$d/$y\n"; next; } print "Formatted $m/$d/$y\n"; }
Date::Manip is not lightning fast but it will swallow just about anything you can imagine - even the output of command line date, even holidays like "Xmas" if you define them.
I like that it has no dependencies - it won't break if some yahoo changes their super-duper module next year. There are apparently plenty of people who despise this code, but look at this (running the code above):
Epoch seconds 1306181152 today Can't accept 05/23/2011 tomorrow Formatted 05/24/2011 next week Formatted 05/30/2011 next tuesday Formatted 05/24/2011 next monday Formatted 05/30/2011 May 15th Can't accept 05/15/2011 Jun 23rd Formatted 06/23/2011 2011-09-08 Formatted 09/08/2011 06/23/11 Formatted 06/23/2011 23-FEB-2013 Formatted 02/23/2013
See Date::Manip examples for more.
If your input stream needs that kind of flexibility, Date::Manip provides it. If not, the smaller and simpler Date::Calc will do the easy conversions:
#!/usr/bin/perl while (<>) { use Date::Calc qw(Decode_Date_US); ($y,$m,$d)=Decode_Date_US($_); print "$y $m $d\n"; }
That code will not like "2011-09-15" (the Date::Manip version will recognize that) or any of "today", "next week" and so on. It will take "09-15-2011" or "09/15/2011".
Got something to add? Send me email.
More Articles by Anthony Lawrence © 2011-05-23 Anthony Lawrence
We are stuck with technology when what we really want is just stuff that works. (Douglas Adams)
Printer Friendly Version
Perl Date::Manip for date validation Copyright © May 2011 Tony Lawrence
Have you tried Searching this site?
This is a Unix/Linux resource website. It contains technical articles about Unix, Linux and general computing related subjects, opinion, news, help files, how-to's, tutorials and more.
Contact us
Printer Friendly Version