[OpenSRF-GIT] OpenSRF branch master updated. a481100ef9d5bd9eaad5a87ce29776cb07a8687c
Evergreen Git
git at git.evergreen-ils.org
Mon Jul 31 12:05:34 EDT 2017
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "OpenSRF".
The branch, master has been updated
via a481100ef9d5bd9eaad5a87ce29776cb07a8687c (commit)
from 66acf02b800b6bb9b128c591e7ce480dc111b99d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit a481100ef9d5bd9eaad5a87ce29776cb07a8687c
Author: Dan Wells <dbw2 at calvin.edu>
Date: Fri Jul 21 14:17:34 2017 -0400
LP#1635737 Add optional context to interval_to_seconds
Any given interval (e.g. "1 month") can be a different amount of
seconds depending on the context (i.e. "1 month" after February 1 is
March 1, but "1 month" after March 1 is April 1, yet March is longer
than February). This affects months all the time, but also can affect
days, hours, and even seconds once you consider DST and "leap" times.
By giving an optional context to interval_to_seconds, you can find the
true number of seconds in, for example, "1 month", when starting from
"February 1" (the context).
Signed-off-by: Dan Wells <dbw2 at calvin.edu>
Signed-off-by: Mike Rylander <mrylander at gmail.com>
diff --git a/src/perl/lib/OpenSRF/Utils.pm b/src/perl/lib/OpenSRF/Utils.pm
index bb6858a..90beb82 100644
--- a/src/perl/lib/OpenSRF/Utils.pm
+++ b/src/perl/lib/OpenSRF/Utils.pm
@@ -7,6 +7,7 @@ use FileHandle;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use Exporter;
use DateTime;
+use DateTime::Duration;
use DateTime::Format::ISO8601;
use DateTime::TimeZone;
@@ -200,7 +201,7 @@ sub noo_es_time {
}
-=head2 $thing->interval_to_seconds('interval') OR interval_to_seconds('interval')
+=head2 $thing->interval_to_seconds('interval', ['context']) OR interval_to_seconds('interval', ['context'])
=head2 $thing->seconds_to_interval($seconds) OR seconds_to_interval($seconds)
@@ -245,31 +246,61 @@ for months (really (365 * 1d)/12 ... that may get smarter, though)
for years (this is 365 * 1d)
+Passing in an optional 'context' (DateTime object) will give you the number of seconds for the passed interval *starting from* the given date (e.g. '1 month' from a context of 'February 1' would return the number of seconds needed to get to 'March 1', not the generic calculation of 1/12 of the seconds in a normal year).
+
=back
=cut
sub interval_to_seconds {
- my $self = shift;
- my $interval = shift || $self;
+ my $class = shift; # throwaway
+ my $interval = ($class eq __PACKAGE__) ? shift : $class;
+ my $context = shift;
- $interval =~ s/(\d{2}):(\d{2}):(\d{2})/ $1 h $2 min $3 s /go;
+ $interval =~ s/(\d{2}):(\d{2}):(\d{2})/ $1 h $2 min $3 s /go;
- $interval =~ s/and/,/g;
- $interval =~ s/,/ /g;
+ $interval =~ s/and/,/g;
+ $interval =~ s/,/ /g;
- my $amount = 0;
+ my $amount;
+ if ($context) {
+ my $dur = DateTime::Duration->new();
+ while ($interval =~ /\s*([\+-]?)\s*(\d+)\s*(\w+)\s*/g) {
+ my ($sign, $count, $type) = ($1, $2, $3);
+ my $func = ($sign eq '-') ? 'subtract' : 'add';
+ if ($type =~ /^s/) {
+ $type = 'seconds';
+ } elsif ($type =~ /^m(?!o)/oi) {
+ $type = 'minutes';
+ } elsif ($type =~ /^h/) {
+ $type = 'hours';
+ } elsif ($type =~ /^d/oi) {
+ $type = 'days';
+ } elsif ($type =~ /^w/oi) {
+ $type = 'weeks';
+ } elsif ($type =~ /^mo/io) {
+ $type = 'months';
+ } elsif ($type =~ /^y/oi) {
+ $type = 'years';
+ }
+ $dur->$func($type => $count);
+ }
+ my $later = $context->clone->add_duration($dur);
+ $amount = $later->subtract_datetime_absolute($context)->in_units( 'seconds' );
+ } else {
+ $amount = 0;
while ($interval =~ /\s*([\+-]?)\s*(\d+)\s*(\w+)\s*/g) {
- my ($sign, $count, $type) = ($1, $2, $3);
- $count = "$sign$count" if ($sign);
- $amount += $count if ($type =~ /^s/);
- $amount += 60 * $count if ($type =~ /^m(?!o)/oi);
- $amount += 60 * 60 * $count if ($type =~ /^h/);
- $amount += 60 * 60 * 24 * $count if ($type =~ /^d/oi);
- $amount += 60 * 60 * 24 * 7 * $count if ($type =~ /^w/oi);
- $amount += ((60 * 60 * 24 * 365)/12) * $count if ($type =~ /^mo/io);
- $amount += 60 * 60 * 24 * 365 * $count if ($type =~ /^y/oi);
+ my ($sign, $count, $type) = ($1, $2, $3);
+ $count = "$sign$count" if ($sign);
+ $amount += $count if ($type =~ /^s/);
+ $amount += 60 * $count if ($type =~ /^m(?!o)/oi);
+ $amount += 60 * 60 * $count if ($type =~ /^h/);
+ $amount += 60 * 60 * 24 * $count if ($type =~ /^d/oi);
+ $amount += 60 * 60 * 24 * 7 * $count if ($type =~ /^w/oi);
+ $amount += ((60 * 60 * 24 * 365)/12) * $count if ($type =~ /^mo/io);
+ $amount += 60 * 60 * 24 * 365 * $count if ($type =~ /^y/oi);
}
- return $amount;
+ }
+ return $amount;
}
sub seconds_to_interval {
-----------------------------------------------------------------------
Summary of changes:
src/perl/lib/OpenSRF/Utils.pm | 65 ++++++++++++++++++++++++++++++-----------
1 files changed, 48 insertions(+), 17 deletions(-)
hooks/post-receive
--
OpenSRF
More information about the opensrf-commits
mailing list