require
5.000;
@ISA
=
qw(Exporter)
;
@EXPORT
=
qw(timegm timelocal)
;
BEGIN {
$SEC
= 1;
$MIN
= 60 *
$SEC
;
$HR
= 60 *
$MIN
;
$DAY
= 24 *
$HR
;
$epoch
= (
localtime
(2
*$DAY
))[5];
$YearFix
= ((
gmtime
(946684800))[5] == 100) ? 100 : 0;
}
sub
timegm {
$ym
=
pack
(C2,
@_
[5,4]);
$cheat
=
$cheat
{
$ym
} ||
&cheat
;
return
-1
if
$cheat
<0 and $^O ne
'VMS'
;
$cheat
+
$_
[0] *
$SEC
+
$_
[1] *
$MIN
+
$_
[2] *
$HR
+ (
$_
[3]-1) *
$DAY
;
}
sub
timelocal {
my
$t
=
&timegm
;
my
$tt
=
$t
;
my
(
@lt
) =
localtime
(
$t
);
my
(
@gt
) =
gmtime
(
$t
);
if
(
$t
<
$DAY
and (
$lt
[5] >= 70 or
$gt
[5] >= 70 )) {
$tt
=
$DAY
;
@lt
=
localtime
(
$tt
);
@gt
=
gmtime
(
$tt
);
}
my
$tzsec
= (
$gt
[1] -
$lt
[1]) *
$MIN
+ (
$gt
[2] -
$lt
[2]) *
$HR
;
my
(
$lday
,
$gday
) = (
$lt
[7],
$gt
[7]);
if
(
$lt
[5] >
$gt
[5]) {
$tzsec
-=
$DAY
;
}
elsif
(
$gt
[5] >
$lt
[5]) {
$tzsec
+=
$DAY
;
}
else
{
$tzsec
+= (
$gt
[7] -
$lt
[7]) *
$DAY
;
}
$tzsec
+=
$HR
if
(
$lt
[8]);
$time
=
$t
+
$tzsec
;
return
-1
if
$cheat
<0 and $^O ne
'VMS'
;
@test
=
localtime
(
$time
+ (
$tt
-
$t
));
$time
-=
$HR
if
$test
[2] !=
$_
[2];
$time
;
}
sub
cheat {
$year
=
$_
[5];
$year
-= 1900
if
$year
> 1900;
$month
=
$_
[4];
croak
"Month '$month' out of range 0..11"
if
$month
> 11 ||
$month
< 0;
croak
"Day '$_[3]' out of range 1..31"
if
$_
[3] > 31 ||
$_
[3] < 1;
croak
"Hour '$_[2]' out of range 0..23"
if
$_
[2] > 23 ||
$_
[2] < 0;
croak
"Minute '$_[1]' out of range 0..59"
if
$_
[1] > 59 ||
$_
[1] < 0;
croak
"Second '$_[0]' out of range 0..59"
if
$_
[0] > 59 ||
$_
[0] < 0;
$guess
= $^T;
@g
=
gmtime
(
$guess
);
$year
+=
$YearFix
if
$year
<
$epoch
;
$lastguess
=
""
;
$counter
= 0;
while
(
$diff
=
$year
-
$g
[5]) {
croak
"Can't handle date ("
.
join
(
", "
,
@_
).
")"
if
++
$counter
> 255;
$guess
+=
$diff
* (363 *
$DAY
);
@g
=
gmtime
(
$guess
);
if
((
$thisguess
=
"@g"
) eq
$lastguess
){
return
-1;
}
$lastguess
=
$thisguess
;
}
while
(
$diff
=
$month
-
$g
[4]) {
croak
"Can't handle date ("
.
join
(
", "
,
@_
).
")"
if
++
$counter
> 255;
$guess
+=
$diff
* (27 *
$DAY
);
@g
=
gmtime
(
$guess
);
if
((
$thisguess
=
"@g"
) eq
$lastguess
){
return
-1;
}
$lastguess
=
$thisguess
;
}
@gfake
=
gmtime
(
$guess
-1);
if
(
"@gfake"
eq
$lastguess
){
return
-1;
}
$g
[3]--;
$guess
-=
$g
[0] *
$SEC
+
$g
[1] *
$MIN
+
$g
[2] *
$HR
+
$g
[3] *
$DAY
;
$cheat
{
$ym
} =
$guess
;
}
1;