The Many Dates and Times of Perl
by Dave Rolsky
|
Pages: 1, 2, 3
- Date::PeriodParser - Simon Cozens
Parses English descriptions of time periods like "this morning" or "around two weeks ago" and turns them into pairs of epoch times representing the beginning and end of the period.
- Date::Range - Tony Bowden
An object for representing a range of dates. Lets you figure out whether two ranges overlap, whether a date is included in a given range, and a few other useful things.
- Date::Roman - Leo Cacciari
An object for representing dates according to the Roman calendar.
- Date::Set - Fl&0xE1;vio Soibelmann Glock
An object that represents sets of datetimes. A set can be either a datetime span, a recurring set of dates, or a fixed set of specific datetimes. It provides set math operations for all of these, as well as allowing you to iterate across the members of the set. Also see
Date::Set::Timezone. - Date::Simple - John Tobey
Adate object that represents dates only, without a time component. It provides date math. It is not epoch-limited.
- Date::Tie - Fl&0xE1;vio Soibelmann Glock
A basic date object with date math. Its functionality is implemented via a tied hash interface. It supports fixed offset time zones, and it is epoch-limited.
- HTTP::Date - Gisle Aas
This module is part of the LWP distribution. It parses many common datetime formats, including all of those that are used by the HTTP protocol. If
Date::Parsedoesn't understand all the formats you need to deal with, this module provides a good alternative. - Time::Duration - Sean Burke
Given a number of seconds, this module return a human language description of the duration. For example, 3660 seconds would be "1 hour and 1 minute".
- Time::Human - Simon Cozens
Given an epoch time, this module can return a string describing that time in colloquial terms, such as "half past nine". It has hooks for localization.
- Time::Unix - Nathan Wiger
Loading this module forces Perl's
time()function to use the Unix epoch system, regardless of the OS on which the code is running. - Time modules - David Muir Sharnoff
This distribution includes
Time::CTime,Time::ParseDate, andTime::Timezone, which are slightly more powerful versions of Graham Barr'sDate::Format,Date::Parse, andTime::Zone.
But Wait, There's More!
Not content to leave well enough alone, I've recently started a project to fix what I see as the fundamental problem with the state of Perl datetime modules. That fundamental problem is that despite the fact that almost all the possible functionality you could want exists, it is scattered over a large number of incompatible modules.
For example, Date::Calc provides good functionality for various
datetime calculations and date math, but the values it returns are not
well suited for being passed to Date::Format. And while
Date::Manip has powerful parsing, the return value from its parsing
routine cannot be passed to any other module without further
massaging. And so and so on.
For example, if I wanted to parse a date with Date::Parse and then
calculate the date one week later with Date::Calc, and then format
it with Date::Format, I'd have to do the following:
my $time1 = str2time($date_string); # Date::Parse
# Today() from Date::Calc returns # date information for an epoch time my ($y1, $m1, $d1) = Today($time);
my ($y2, $m2, $d2) = Add_Delta_Days($y1, $m1, $d1, 7);
my $time2 = Date_to_Time($y2, $m2, $d2);
print strftime('%B %d, %Y', $time2);
Of course, I didn't have to use the strftime() function for
formatting a date. I could have done it with just Date::Calc as:
print sprintf('%s %02d %04d',
Month_to_Text($m2), $d2, $y2);
But I want convenience. If I'm dealing with many datetimes and I need to parse various inputs, generate different formats, and do lots of calculations, then a convenient and uniform API can go a long way towards code maintainability. The extra glue code needed to make different modules cooperate can quickly obscure the actual intent of the program.
Efforts in the past to herd all the existing module authors towards a common API have failed, so rather than try that again, I decided to just write even more datetime code. As we all know, the best way to put out a fire is to pour copious amounts of gasoline on it. In order to make my project sound cool, I'm calling it the "Perl DateTime Suite", which sounds much better than "more date and time modules".
The goal for this project is to produce a suite of datetime modules that do everything you'd ever need related to dates and times. The modules in this suite will cooperate with each other, which means that a module that parses datetimes will return a standard object, and a module for formatting datetimes will accept that standard object.
So far, this project has attracted interest from a number of people,
and discussions on the datetime@perl.org list have gone well.
Recently, I released alpha versions of the core object,
DateTime.pm, as well as DateTime::TimeZone, which provides
complete time zone support based on the Olson database. There is also
an alpha of DateTime::Format::ICal on CPAN, a module for parsing
and formatting iCal datetimes and durations. In the future, look for
more modules in the suite, all of which will begin with "DateTime::".
Further Resources and Reading
Some excellent online resources include Claus Tondering's Calendar FAQ at http://www.tondering.dk/claus/calendar.html, as well as the US Naval Observatory Time Service site at http://tycho.usno.navy.mil/. For more information on time zones and the Olson database, see http://www.twinsun.com/tz/tz-link.htm.
If you're interested in discussing anything related to Perl and datetimes, check out the datetime@perl.org list. You can subscribe by sending a message to datetime-subscribe@perl.org.
Thanks
Thanks to Jonathan Scott Duff, Nick Tonkin, and Iain Truskett for reviewing this article before publication.

