3
鑑於以下DateTime::SpanSet
包含6個DateTime::Span
對象(每個跨度打印start
和end
DateTime
),我想反轉它並限制它的跨度。更好的方法來限制在perl中反轉的DateTime :: SpanSet?
[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
從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;
}
是否有可能以更好的方式做到這一點?