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;
}
Returns:
966770661
966770661
3049601062
Sun Aug 20 07:24:22 2000