鉴于以下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;
}
是否有可能以更好的方式做到这一点?