add an RBN line to progress
[spider.git] / perl / IsoTime.pm
index 422f99123d350c8ec559346d680ed1432ea6d117..23af449d8606a05f39accf19e414caee542950df 100644 (file)
@@ -1,9 +1,9 @@
 #
 # Utility routines for handling Iso 8601 date time groups
 #
-# $Id$
 #
-# Copyright (c) Dirk Koopman, G1TLH
+#
+# Copyright (c) 2006 Dirk Koopman, G1TLH
 #
 
 use strict;
@@ -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;