develooper Front page | perl.datetime | Postings from April 2012

epoch to UTCstring conversion at leap-second boundary

Thread Next
From:
Andrew Davis
Date:
April 5, 2012 13:32
Subject:
epoch to UTCstring conversion at leap-second boundary
Message ID:
E1SFtM8-0002IL-Si@smtp2go.com

I need to obtain UTC date-time strings from an epoch input.
The UTC output needs to take leap-seconds into account.
I wrote this script to test things:

#!/usr/local/bin/perl

use strict;
use DateTime;
use DateTime::Format::Epoch;

my $dt = DateTime->new(year => 2008, month => 12, day => 31, 
time_zone => "UTC");
my $formatter = DateTime::Format::Epoch->new(
                       epoch          => $dt,
                       unit           => 'seconds',
                       type           => 'int',
                       skip_leap_seconds => 0,
                       start_at       => 0,
                       local_epoch    => undef,
         );

my $epoch = 86398;
for (my $ii=0; $ii<=4; $ii++) {
    my $dt2 = $formatter->parse_datetime( $epoch );
    print "$dt2\n";
    $epoch++;
}

Since there was a leap-second add at the end of 2008, I expected (wanted)
to get the following output:
2008-12-31T23:59:58
2008-12-31T23:59:59
2008-12-31T23:59:60
2009-01-01T00:00:00
2009-01-01T00:00:01

However, I got this error instead:
2008-12-31T23:59:58
2008-12-31T23:59:59
The 'hour' parameter ("24") to DateTime::new did not pass the 'an 
integer between 0 and 23' callback
  at 
/usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/DateTime.pm 
line 201
         DateTime::new(undef, 'hour', 24, 'minute', 0, 'second', 0, 
'month', 12, ...) called at 
/usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/DateTime.pm 
line 566
         DateTime::from_object(undef, 'object', 
'DateTime::Format::Epoch::_DateTime=HASH(0x89c98cc)') called at 
/usr/local/lib/perl5/site_perl/5.10.0/DateTime/Format/Epoch.pm line 180
         DateTime::Format::Epoch::parse_datetime('DateTime::Format::Epoch=HASH(0x892e5ac)', 
86400) called at ./testleap.pl line 19

If I set skip_leap_seconds to TRUE, I get no error, but the result is not
what I want:
2008-12-31T23:59:58
2008-12-31T23:59:59
2009-01-01T00:00:00
2009-01-01T00:00:01
2009-01-01T00:00:02

I'm hoping someone can tell me the best way to avoid the error, and
get the "2008-12-31T23:59:60" output that I want.

Thanks!
Andrew





Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About