X-Git-Url: https://defaria.com/gitweb/?a=blobdiff_plain;f=lib%2FDateUtils.pm;h=f8bfc1c8c0caa7a6783a6e7d0676d2ef0a06445f;hb=525b9167625b04ff3560456ec8329d1c640bf22d;hp=40a581e74164f7301bd0a5b7552d9939a34e531e;hpb=bdb1e0c845a6921e22d52fbff3404d5c1dfae520;p=clearscm.git diff --git a/lib/DateUtils.pm b/lib/DateUtils.pm index 40a581e..f8bfc1c 100644 --- a/lib/DateUtils.pm +++ b/lib/DateUtils.pm @@ -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 @@ -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