develooper Front page | perl.perl6.language.datetime | Postings from August 2000

Re: epoch for time

Thread Previous | Thread Next
Chris Nandor
August 20, 2000 04:34
Re: epoch for time
Message ID:
At 15:02 -1000 2000.08.19, Tim Jenness wrote:
>I'm of the camp that feels perl should have a fixed epoch rather than the
>epoch of the underlining OS. Furthermore, I can understand that the OS
>epoch can also be important when looking outside of perl. Thinking this
>over for a while it occurred to me that time() currently has no arguments
>and that an epoch argument would seemingly solve all our problems.
>     time()          - returns seconds since Perl epoch
>     time("sys")     - seconds since start of OS epoch
>     time("tai")     - seconds since TAI began
>     time("jul")     - seconds since julian day 0
>     time("vms")     - seconds since VMS epoch (MJD 0)
>     time("wall")    - seconds since Larry Wall was born
>     etc.
>The only assumption here is that time() returns seconds (not necessarily
>integers) from an epoch and that Perl epoch is the thing expected by the
>localtime() replacement. Whether time() returns fractioanl seconds or a
>libtai object (with seconds and nanoseconds) is another issue.

So what would (stat($_))[8,9,10] return?  :)

I think maybe what should happen instead is that a function or module be
provided to handle epoch conversions, to and from the default "Perl" epoch.
perl2epoch($perlsec, 'vms'), epoch2perl($vmssec, 'vms').

>All of
>these are simply integer second offsets from each other.

Not quite.  For Mac OS, you'd need a third time zone argument (perhaps
offset from GMT), since Mac OS epoch is seconds sin Jan 01, 1904 00:00:00
_local time_:  perl2epoch($perlsec, 'macos', '-0500').  Yummy.

Anyway, here is some code that works.

#!perl -wl
my $perlsec  = 966770661;
my $epochsec = perl2epoch($perlsec, 'macos', '-0400');
my $perlsec2 = epoch2perl($epochsec, 'macos');

print $perlsec;
print $perlsec2;
print $epochsec;
print scalar localtime $epochsec;

sub perl2epoch {
    my($perlsec, $epoch, @extra) = @_;
    my $epochsec;

    if ($epoch eq 'macos') {
        $epochsec = $perlsec + macos_offset();
        $epochsec += tz_offset($extra[0]);

    return $epochsec;


sub epoch2perl {
    my($epochsec, $epoch, @extra) = @_;
    my $perlsec;

    if ($epoch eq 'macos') {
        $perlsec = $epochsec - macos_offset();
        $perlsec -= tz_offset($extra[0]);

    return $perlsec;


sub macos_offset () { 2082844801 }

# guess with Time::Local if not provided?
sub tz_offset {
    my($offset) = @_;
    my $tz_offset;

    if ($offset) {
        $tz_offset = $offset * 36;
    } else {
        require Time::Local;
        $tz_offset = sprintf "%+0.4d\n", (Time::Local::timelocal(localtime)
            - Time::Local::timelocal(gmtime));

    return $tz_offset;


Sun Aug 20 07:24:22 2000

Chris Nandor       |      |
Andover.Net        | |

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About