Sanity check: Date::Manip versus summer time

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!


I have been using Date::Manip for convenient and flexible (though
heavyweight) time input, and I have discovered a behaviour that I find odd.

Given TZ=EST5EDT, it interprets 'jan 1 2006 noon' as 17:00 GMT. So far
so good.

But it also interprets 'jul 1 2006 noon' as 17:00 GMT (at least, when
run on Jan 24). Shouldn't it be 16:00 GMT?

If you give it TZ=EDT, 'jul 1 2006 noon' indeed comes out 16:00 GMT.

Am I crazy? Do I not know how to use the module? Did I miss something in
the docs? Do I have the wrong meaning for "is"? It seems arrogant to
assume I've found a bug this flagrant in a module that has been around
this long. No, I have not bothered Sullivan Beck with this yet.

We're talking Date::Manip v5.44, Perl 5.8.6, and Darwin (i.e. Mac OS X).
The details, including the test script, follow.

Tom Wyant

$ perl -v

This is perl, v5.8.6 built for darwin-2level

Copyright 1987-2004, Larry Wall

Perl may be copied only under the terms of either the Artistic License
or the GNU General Public License, which may be found in the Perl 5
source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to
the Internet, point your browser at /, the Perl Home

Wyants-White-iMac:~/Code/TLE/ECI tom 18:10:08
$ perl -MDate::Manip -le 'print Date::Manip->VERSION'
Wyants-White-iMac:~/Code/TLE/ECI tom 18:12:01
$ perl 'jan 1 2006 noon' TZ=EST5EDT
Date 'jan 1 2006 noon' parsed to 'Sun Jan  1 17:00:00 2006' GMT
Wyants-White-iMac:~/Code/TLE/ECI tom 18:10:29
$ perl 'jul 1 2006 noon' TZ=EST5EDT
Date 'jul 1 2006 noon' parsed to 'Sat Jul  1 17:00:00 2006' GMT
Wyants-White-iMac:~/Code/TLE/ECI tom 18:10:37
$ perl 'jul 1 2006 noon' TZ=EDT
Date 'jul 1 2006 noon' parsed to 'Sat Jul  1 16:00:00 2006' GMT
Wyants-White-iMac:~/Code/TLE/ECI tom 18:10:43

Here is

use strict;
use warnings;

use Date::Manip;
use File::Basename;
use Getopt::Long;

my %opt;

GetOptions (\%opt, qw{final initial}) && @ARGV or die <<eod;

Test Date::Manip behaviour.

usage: perl @{[basename $0]} [options] date [initialization ...]

Where the date must acceptable to ParseDate, the initialization
strings must be acceptable to Date_Init, and the legal options

  -final = dump final output of Date_Init ()
  -initial = dump initial output of Date_Init ()


my $string = shift @ARGV;

my @initial = Date_Init (@ARGV);
$opt and
     print "Initial configuration:\n", map @initial;
$opt and
     print "Final configuration:\n", map Date_Init ();

my $time = UnixDate ($string, '%s') or
     die "Failed to parse '$string'.\n";

printf "Date '$string' parsed to '%s' GMT\n", scalar gmtime $time;

Site Timeline