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