Rick Measham wrote:
>
> I'm trying to get next/previous spans from a given DateTime. I'm
> defining next/previous as the event who started before or after $dt.
> Where it ends doesn't matter, even if we're still in the middle of the
> event.
Here is an example (tested):
---
use strict;
use DateTime::Span;
# build a spanset
my $span1 = DateTime::Span->new(
start => DateTime->new( year => 2000 ),
end => DateTime->new( year => 2003 ) );
my $span2 = DateTime::Span->new(
start => DateTime->new( year => 2006 ),
end => DateTime->new( year => 2009 ) );
my $span3 = DateTime::Span->new(
start => DateTime->new( year => 2012 ),
end => DateTime->new( year => 2015 ) );
my $spanset = $span1->union( $span2 )->union( $span3 );
print "SpanSet ".$spanset->{set}."\n";
print "\n";
my $dt = DateTime->new( year => 2005 );
for ( 1 .. 3 )
{
print "dt: ".$dt->datetime."\n";
my $after = DateTime::Span->new( start => $dt );
my $before = DateTime::Span->new( end => $dt );
my $next = $after->intersection( $spanset )->next;
my $previous = $before->intersection( $spanset )->previous;
print "next: ".$next->{set}."\n";
print "previous: ".$previous->{set}."\n";
print "\n";
$dt->add( years => 3 );
}
---
SpanSet
[2000-01-01T00:00:00..2003-01-01T00:00:00],[2006-01-01T00:00:00..2009-01-01T00:00:00],[2012-01-01T00:00:00..2015-01-01T00:00:00]
dt: 2005-01-01T00:00:00
next: [2006-01-01T00:00:00..2009-01-01T00:00:00]
previous: [2000-01-01T00:00:00..2003-01-01T00:00:00]
dt: 2008-01-01T00:00:00
next: [2008-01-01T00:00:00..2009-01-01T00:00:00]
previous: [2006-01-01T00:00:00..2008-01-01T00:00:00]
dt: 2011-01-01T00:00:00
next: [2012-01-01T00:00:00..2015-01-01T00:00:00]
previous: [2006-01-01T00:00:00..2009-01-01T00:00:00]
---
> All the above takes time. Seconds in fact!
It was not noticeably slow here. Would you test this?
> Surely there's a better way
> ... I'd really like to have $spanset->next_span($dt) and
> $spanset->previous_span($dt) but if there's some way to do it myself
> that is better than what I'm doing I'd love to know.
DT::SpanSet misses all these methods:
next( $dt )
previous( $dt )
current( $dt )
closest( $dt )
as_list
Is it ok to implement this in DT::SpanSet?
- Flavio S. Glock