次のDateTime::SpanSet
6 つDateTime::Span
のオブジェクト (印刷されたものstart
とend
DateTime
各スパン) を含む場合、それを反転し、スパンで制限したいと考えています。
[2013-02-04T00:00:00 -> 2013-02-04T03:00:00]
[2013-02-04T07:30:00 -> 2013-02-04T12:00:00]
[2013-02-04T12:45:00 -> 2013-02-04T16:45:00]
[2013-02-05T07:30:00 -> 2013-02-05T16:45:00]
[2013-02-06T08:00:00 -> 2013-02-06T16:30:00]
[2013-02-07T16:00:00 -> 2013-02-08T16:30:00]
を使用して反転すると、complement
次のようになります。
[-inf -> 2013-02-04T00:00:00]
[2013-02-04T03:00:00 -> 2013-02-04T07:30:00]
[2013-02-04T12:00:00 -> 2013-02-04T12:45:00]
[2013-02-04T16:45:00 -> 2013-02-05T07:30:00]
[2013-02-05T16:45:00 -> 2013-02-06T08:00:00]
[2013-02-06T16:30:00 -> 2013-02-07T16:00:00]
[2013-02-08T16:30:00 -> inf]
私が探している最終結果はDateTime::Span
fromによって制限され2013-02-04T00:00:00 -> 2013-02-11T00:00:00
、次の結果が得られます。
[2013-02-04T03:00:00 -> 2013-02-04T07:30:00]
[2013-02-04T12:00:00 -> 2013-02-04T12:45:00]
[2013-02-04T16:45:00 -> 2013-02-05T07:30:00]
[2013-02-05T16:45:00 -> 2013-02-06T08:00:00]
[2013-02-06T16:30:00 -> 2013-02-07T16:00:00]
[2013-02-08T16:30:00 -> 2013-02-11T00:00:00]
次の方法でこれを達成できます。
sub invertSpansetByBoundary {
my $spanset = shift;
my $boundary = shift;
$spanset = $spanset->complement;
my $iter = $spanset->iterator(span => $boundary);
my $ss = DateTime::SpanSet->empty_set();
while(my $timespan = $iter->next) {
$ss = $ss->union($timespan);
}
return $ss;
}
これをより良い方法で行うことは可能ですか?