X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FIsoTime.pm;h=18cab5ac61a657eaa3aea591169a186f661c3adf;hb=refs%2Fheads%2Fmaster;hp=422f99123d350c8ec559346d680ed1432ea6d117;hpb=af378e74088394d9c70a9a01d67a311cf4774d96;p=spider.git diff --git a/perl/IsoTime.pm b/perl/IsoTime.pm index 422f9912..18cab5ac 100644 --- a/perl/IsoTime.pm +++ b/perl/IsoTime.pm @@ -1,7 +1,7 @@ # # Utility routines for handling Iso 8601 date time groups # -# $Id$ +# # # Copyright (c) Dirk Koopman, G1TLH # @@ -12,12 +12,7 @@ package IsoTime; use Date::Parse; -use vars qw($VERSION $BRANCH $year $month $day $hour $min $sec @days @ldays); -$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); -$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); -$main::build += $VERSION; -$main::branch += $BRANCH; - +use vars qw($year $month $day $hour $min $sec @days @ldays); @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); @ldays = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); @@ -43,6 +38,17 @@ sub daymin return sprintf "%02dT%02d%02d", $day, $hour, $min; } +sub hourmin +{ + return sprintf "%02d%02d", $hour, $min; + +} + +sub hourminsec +{ + return sprintf "%02d%02d%02d", $hour, $min, $sec; +} + sub update { my $t = shift || time; @@ -54,9 +60,23 @@ sub update sub unixtime { my $iso = shift; - - # get the correct month and year if it is a short date - if (my ($d) = $iso =~ /^(\d\d)T\d\d\d\d/) { + + # get the correct day, if required + if (my ($h) = $iso =~ /^([012]\d)[0-5]\d(?:[0-5]\d)?$/) { + my ($d, $m, $y) = ($day, $month, $year); + if ($h != $hour) { + if ($hour < 12 && $h - $hour >= 12) { + # yesterday + ($d, $m, $y) = _yesterday($d, $m, $y); + } elsif ($hour >= 12 && $hour - $h > 12) { + # tomorrow + ($d, $m, $y) = _tomorrow($d, $m, $y); + } + } + $iso = sprintf("%04d%02d%02dT", $y, $m, $d) . $iso; + } elsif (my ($d) = $iso =~ /^(\d\d)T\d\d\d\d/) { + + # get the correct month and year if it is a short date if ($d == $day) { $iso = sprintf("%04d%02d", $year, $month) . $iso; } else { @@ -83,7 +103,46 @@ sub unixtime } $iso = sprintf("%04d%02d", $y, $m) . $iso; } - } + } + return str2time($iso); } + +sub _tomorrow +{ + my ($d, $m, $y) = @_; + + $d++; + my $days = _isleap($y) ? $ldays[$month-1] : $days[$month-1]; + if ($d > $days) { + $d = 1; + $m++; + if ($m > 12) { + $m = 1; + $y++; + } else { + $y = $year; + } + } + + return ($d, $m, $y); +} + +sub _yesterday +{ + my ($d, $m, $y) = @_; + + $d--; + if ($d <= 0) { + $m--; + $y = $year; + if ($m <= 0) { + $m = 12; + $y--; + } + $d = _isleap($y) ? $ldays[$m-1] : $days[$m-1]; + } + + return ($d, $m, $y); +} 1;