# # Validating free-form input dates with Perl's Date::Manip
APLawrence.com -  Resources for Unix and Linux Systems, Bloggers and the self-employed

Perl Date::Manip for date validation

I've removed advertising from most of this site and will eventually clean up the few pages where it remains.

While not terribly expensive to maintain, this does cost me something. If I don't get enough donations to cover that expense, I will be shutting the site down in early 2020.

If you found something useful today, please consider a small donation.



Some material is very old and may be incorrect today

© May 2011 Anthony Lawrence

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.

Date::Calc

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".

If you found something useful today, please consider a small donation.



Got something to add? Send me email.





(OLDER)    <- More Stuff -> (NEWER)    (NEWEST)   

Printer Friendly Version

->
-> Validating free-form input dates with Perl's Date::Manip


Inexpensive and informative Apple related e-books:

Sierra: A Take Control Crash Course

Take Control of IOS 11

Photos: A Take Control Crash Course

El Capitan: A Take Control Crash Course

Take Control of iCloud





More Articles by © Anthony Lawrence





Printer Friendly Version

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





We are stuck with technology when what we really want is just stuff that works. (Douglas Adams)




Linux posts

Troubleshooting posts


This post tagged:

Perl

Programming

Scripting



Unix/Linux Consultants

Skills Tests

Unix/Linux Book Reviews

My Unix/Linux Troubleshooting Book

This site runs on Linode