Fixing up numbers and totals
[clearscm.git] / lib / DateUtils.pm
index 40a581e..f8bfc1c 100644 (file)
@@ -121,7 +121,7 @@ sub ymdhms(;$) {
     $wday,
     $yday,
     $isdst
-  ) = localtime($time);
+  ) = localtime ($time);
 
   # Adjust month
   $mon++;
@@ -145,11 +145,11 @@ sub julian($$$) {
   my $days = 0;
   my $m    = 1;
 
-  foreach (@months) {
+  for (@months) {
     last if $m >= $month;
     $m++;
     $days += $_;
-  } # foreach
+  } # for
 
   return $days + $day;
 } # julian
@@ -192,7 +192,7 @@ Hash of parms. Acceptable values are of the following format:
  hours   => $hours
  days    => $days
  month   => $month
-
 Note that month will simply increment the month number, adjusting for overflow
 of year if appropriate. Therefore a date of 2/28/2001 would increase by 1 month
 to yield 3/28/2001. And, unfortunately, an increase of 1 month to 1/30/2011 
@@ -225,7 +225,7 @@ Returns:
   );
 
   for (keys %parms) {
-    unless (InArray($_, @validKeys)) {
+    unless (InArray ($_, @validKeys)) {
       croak "Invalid key in DateUtils::Add: $_";
     } # unless
   } # for
@@ -255,9 +255,9 @@ Returns:
     my $month = substr $datetime, 5, 2;
 
     $years += ($month + $months) / 12;
-    substr($datetime, 5, 2) = ($month + $months) % 12;
+    substr ($datetime, 5, 2) = ($month + $months) % 12;
 
-    substr($datetime, 0, 4) = substr ($datetime, 0, 4) + $years;
+    substr ($datetime, 0, 4) = substr ($datetime, 0, 4) + $years;
   } # if
 
   return $datetime;
@@ -312,13 +312,12 @@ Returns:
   my $timestamp_days = julian $timestamp_year, $month, $day;
 
   if ($timestamp_year > $today_year or
-     ($timestamp_days > $today_days and $timestamp_year == $today_year)) {
+      ($timestamp_days > $today_days and $timestamp_year == $today_year)) {
     return;
   } else {
     my $leap_days = 0;
 
     for (my $i = $timestamp_year; $i < $today_year; $i++) {
-
       $leap_days++ if $i % 4 == 0;
     } # for
 
@@ -332,7 +331,7 @@ sub Compare($$) {
 
 =pod
 
-=head2 Compare ($date2, $date2)
+=head2 Compare ($date1, $date2)
 
 Compares two datetimes returning -1 if $date1 < $date2, 0 if equal or 1 if
 $date1 > $date2
@@ -439,10 +438,9 @@ Returns:
 
   $days += $monthDays[$month - 1];
 
-  $days++
-    if _is_leap_year ($year) and $month > 2;
+  $days++ if _is_leap_year ($year) and $month > 2;
 
- $days += $day - 1;
 $days += $day - 1;
 
   return ($days   * $SECS_IN_DAY)
        + ($hour   * $SECS_IN_HOUR)
@@ -487,22 +485,22 @@ Returns:
 
 =cut
 
-  my $year = 1970;
   my ($month, $day, $hour, $minute, $seconds);
+
+  my $year         = 1970;
   my $leapYearSecs = 366 * $SECS_IN_DAY;
   my $yearSecs     = $leapYearSecs - $SECS_IN_DAY;
 
   while () {
     my $amount = _is_leap_year ($year) ? $leapYearSecs : $yearSecs;
 
-    last
-      if $amount > $epoch;
+    last if $amount > $epoch;
 
     $epoch -= $amount;
     $year++;
   } # while
 
-  my $leapYearAdjustment = _is_leap_year($year) ? 1 : 0;
+  my $leapYearAdjustment = _is_leap_year ($year) ? 1 : 0;
 
   if ($epoch >= (334 + $leapYearAdjustment) * $SECS_IN_DAY) {
     $month = '12';
@@ -541,11 +539,11 @@ Returns:
     $month = '01';
   } # if
 
-  $day     = int(($epoch / $SECS_IN_DAY) + 1);
+  $day     = int (($epoch / $SECS_IN_DAY) + 1);
   $epoch   = $epoch % $SECS_IN_DAY;
-  $hour    = int($epoch / $SECS_IN_HOUR);
+  $hour    = int ($epoch / $SECS_IN_HOUR);
   $epoch   = $epoch % $SECS_IN_HOUR;
-  $minute  = int($epoch / $SECS_IN_MIN);
+  $minute  = int ($epoch / $SECS_IN_MIN);
   $seconds = $epoch % $SECS_IN_MIN;
 
   $day     = "0$day"     if $day     < 10;
@@ -594,16 +592,16 @@ Returns:
 =cut
 
   my @localtime = localtime;
-  my ($sec, $min, $hour, $mday, $mon, $year) = gmtime(
+  my ($sec, $min, $hour, $mday, $mon, $year) = gmtime (
     DateToEpoch ($datetime) - (timegm (@localtime) - timelocal (@localtime))
   );
 
   $year += 1900;
   $mon++;
 
-  $sec  = '0' . $sec  if $sec  < 10;  
-  $min  = '0' . $min  if $min  < 10;  
-  $hour = '0' . $hour if $hour < 10;  
+  $sec  = '0' . $sec  if $sec  < 10;
+  $min  = '0' . $min  if $min  < 10;
+  $hour = '0' . $hour if $hour < 10;
   $mon  = '0' . $mon  if $mon  < 10;
   $mday = '0' . $mday if $mday < 10;
 
@@ -621,17 +619,17 @@ sub UTC2Localtime($) {
 
   my @localtime = localtime;
 
-  return EpochToDate (
+  return EpochToDate(
     DateToEpoch ($utcdatetime) + (timegm (@localtime) - timelocal (@localtime))
   );
 } # UTC2Localtime
 
-sub FormatDate($) {
-  my ($date) = @_;
+sub FormatDate($;$) {
+  my ($date, $separator) = @_;
 
 =pod
 
-=head2 FormatDate ($date)
+=head2 FormatDate ($date, $separator)
 
 Formats date
 
@@ -645,6 +643,10 @@ Parameters:
 
 Date in YYYYMMDD
 
+=tiem $separator
+
+If specified, indicates that $date has separators (e.g. 2021-07-04).
+
 =back
 
 =for html </blockquote>
@@ -663,11 +665,17 @@ Returns:
 
 =cut
 
-  return substr ($date, 4, 2)
-       . "/"
-       . substr ($date, 6, 2)
-       .  "/"
-       . substr ($date, 0, 4);
+  unless ($separator) {
+    return substr($date, 4, 2) . '/'
+         . substr($date, 6, 2) . '/'
+         . substr($date, 0, 4);
+  } else {
+    return substr($date, 5, 2)
+         . '/'
+         . substr($date, 8, 2)
+         . '/' 
+         . substr($date, 0, 4);
+  } # if
 } # FormatDate
 
 sub FormatTime($) {
@@ -815,7 +823,7 @@ Returns:
   my $year  = substr $sqldatetime, 0, 4;
   my $month = substr $sqldatetime, 5, 2;
   my $day   = substr $sqldatetime, 8, 2;
-  my $time  = FormatTime(substr $sqldatetime, 11);
+  my $time  = FormatTime (substr $sqldatetime, 11);
 
   return $months{$month} . " $day, $year \@ $time";
 } # SQLDatetime2UnixDatetime
@@ -869,6 +877,14 @@ Returns:
   my $month = substr $timestamp, 5, 2;
   my $day   = substr $timestamp, 8, 2;
 
+  # We are not properly accounting for leap days but this is just a rough
+  # estimate anyway
+  if ($nbr_of_days > 365) {
+    $year -= int $nbr_of_days / 365;
+
+    $nbr_of_days = $nbr_of_days % 365;
+  } # if
+
   # Convert to Julian
   my $days = julian $year, $month, $day;
 
@@ -948,7 +964,7 @@ Returns:
 
 =cut
 
-  return UnixDatetime2SQLDatetime (scalar (localtime));
+  return UnixDatetime2SQLDatetime(scalar localtime);
 } # Today2SQLDatetime
 
 sub UnixDatetime2SQLDatetime($) {
@@ -1257,72 +1273,6 @@ Returns:
   return "$year$mon${mday}_$hour$min$sec";
 } # timestamp
 
-sub MDYHMS2SQLDatetime($) {
-  my ($datetime) = @_;
-
-  $datetime =~ s/^\s+|\s+$//g;
-
-  my ($year, $mon, $day, $hour, $min, $sec, $ampm);
-
-  # For datetime format of MM/DD/YYYY HH:MM:SS [Am|Pm]
-  if ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2}) (\w{2})$/) {
-    $mon   = $1;
-    $day   = $2;
-    $year  = $3;
-    $hour  = $4;
-    $min   = $5;
-    $sec   = $6;
-    $ampm  = $7;
-  # For datetime format of MM/DD/YYYY HH:MM:SS
-  } elsif ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/){
-    $mon   = $1;
-    $day   = $2;
-    $year  = $3;
-    $hour  = $4;
-    $min   = $5;
-    $sec   = $6;
-  # For datetime format of MM/DD/YYYY
-  } elsif ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/) {
-    $mon   = $1;
-    $day   = $2;
-    $year  = $3;
-    $hour  = '00';
-    $min   = '00';
-    $sec   = '00';
-  } else {
-    return
-  } # if
-
-  # Range checks
-  return if $mon  > 12 or $mon  <= 0;
-  return if $day  > 31 or $day  <= 0;
-  return if $hour > 23 or $hour <  0;
-  return if $min  > 59 or $min  <  0;
-
-  if ($day >= 31 and ($mon == 2
-                   or $mon == 4
-                   or $mon == 6
-                   or $mon == 9
-                   or $mon == 11)) {
-    return;
-  } # if
-
-  return if $day >  29 and  $mon == 2;
-  return if $day == 29 and  $mon == 2 and not _is_leap_year($year);
-
-  # Convert to 24 hour time if necessary
-  $hour += 12 if $ampm and $ampm =~ /pm/i;
-
-  # Add any leading zeros
-  $mon  = "0$mon"  if length $mon  == 1;
-  $day  = "0$day"  if length $day  == 1;
-  $hour = "0$hour" if length $hour == 1;
-  $min  = "0$min"  if length $min  == 1;
-  $sec  = "0$sec"  if length $sec  == 1;
-
-  return "$year-$mon-$day $hour:$min:$sec";
-} # MDYHMS2SQLDatetime
-
 1;
 
 =head2 DEPENDENCIES