Re: DateTime segments in series: Is there prior art?
[email protected] (James E Keenan) Mon, 09 Sep 2013 21:56:35 -0400
| Newsgroups | perl.datetime |
|---|---|
| Message-ID | <[email protected]> |
cc list On 9/9/13 4:54 AM, Flavio S. Glock wrote: > Hi James, > > Yes, you are using DateTime::SpanSet correctly, but maybe this is not the > right data structure for your problem. > The problem that DateTime::SpanSet solves is exactly about using Spans as a > single data entity - and the Spans are merged whenever possible. > This is more complex than what you need, and it gets in the way. > > There are some workarounds - you could define the spans with > 'after'/'before' - this would effectively create a "hole" in the data when > the spans are merged. > > Maybe your problem is better solved by iterating over the list of Spans > that you already have. > > > > 2013/9/9 James E Keenan<[email protected]> > >> On 8/11/13 1:25 PM, Flavio S. Glock wrote: >> >>> http://search.cpan.org/dist/**DateTime-Set/lib/DateTime/**SpanSet.pm<http://search.cpan.org/dist/DateTime-Set/lib/DateTime/SpanSet.pm> >>> >>> next() and previous() can be used to determine whether a given point >>> in time falls between, before, or after the segments. >>> >>> intersects() can tell whether a new segment would intersect existing >>> segments. >>> >>> >> Flavio, thank you for pointing me to that distribution. I have been >> experimenting with DateTime::Span and find it helpful, but there's a >> problem with DateTime::SpanSet -- or perhaps with my understanding of that >> module. >> >> Once again, my original problem: >> >> >> 2013/8/11 James E Keenan<[email protected]>: >>> >>>> I need to use DateTime functionality and would like to know >>>> if the particular functionality I need already exists on >>>> CPAN. >>>> >>>> I need to construct a series of time segments which do not >>>> overlap but which do not need to be contiguous. Each >>>> segment is defined by a start date which is part of the >>>> segment and by an end date which is the first moment in time >>>> after the segment's conclusion. >>>> >>>> >> I can use a start date and an end date to compose a DateTime::Span object >> for each segment. (It turns out not to matter so much whether the the >> segment is, in DT::S parlance, 'semi-open' or 'closed', i.e., whether I >> define the object with the second date with 'before' or with 'end'.) >> >> However, I see that when (a) the end date of one segment is identical to >> the start date of the next segment; and (b) I use DateTime::SpanSet to >> create a spanset; then those two segments are, in effect, merged -- which >> seems counterintuitive. The only way I can get a spanset with the same >> number of elements as the spans going in is to make sure that the end date >> of one segment is one unit of time less than the start date of the second >> segment. >> >> The attached program, bspanset.pl, illustrates this problem. As a >> convenience, I have divided the program into 7 sections named with roman >> numerals. >> >> In Section I, I create 4 pairs of DateTime objects. The end date of the >> first pair is identical to the start date of the second pair. Likewise for >> the third and fourth pairs. But there is a gap between the second and >> third pairs. The output: >> >> # I: >> >> start: 2012-12-15T00:00:00 end: 2013-01-01T00:00:00 >> start: 2013-01-01T00:00:00 end: 2013-02-01T00:00:00 >> start: 2013-03-01T00:00:00 end: 2013-04-01T00:00:00 >> start: 2013-04-01T00:00:00 end: 2013-04-15T00:00:00 >> >> In Section II, I create DateTime::Span objects from each pair. I use >> 'before' to create semi-open objects. >> >> # II: >> >> start: 2012-12-15T00:00:00 end: 2013-01-01T00:00:00 >> start: 2013-01-01T00:00:00 end: 2013-02-01T00:00:00 >> start: 2013-03-01T00:00:00 end: 2013-04-01T00:00:00 >> start: 2013-04-01T00:00:00 end: 2013-04-15T00:00:00 >> >> In Section III, I create a DateTime::SpanSet object from the 4 >> DateTime::Span objects. But this SpanSet object only contains two >> elements. The first and second have been merged, as have the third and >> fourth. >> >> # III: >> >> start: 2012-12-15 end: 2013-02-01 >> start: 2013-03-01 end: 2013-04-15 >> >> In Sections IV an V, I repeat II and III, only with 'end' to create closed >> objects. I still end up with only two elements in the DateTime::SpanSet >> object. >> >> # IV: >> >> start: 2012-12-15T00:00:00 end: 2013-01-01T00:00:00 >> start: 2013-01-01T00:00:00 end: 2013-02-01T00:00:00 >> start: 2013-03-01T00:00:00 end: 2013-04-01T00:00:00 >> start: 2013-04-01T00:00:00 end: 2013-04-15T00:00:00 >> >> # V: >> >> start: 2012-12-15 end: 2013-02-01 >> start: 2013-03-01 end: 2013-04-15 >> >> In Section VI, I subtract one second from the latter date in each pair, >> then use that to create a closed object. >> >> # VI: >> >> start: 2012-12-15T00:00:00 end: 2012-12-31T23:59:59 >> start: 2013-01-01T00:00:00 end: 2013-01-31T23:59:59 >> start: 2013-03-01T00:00:00 end: 2013-03-31T23:59:59 >> start: 2013-04-01T00:00:00 end: 2013-04-14T23:59:59 >> >> In Section VII, I created a DateTime::SpanSet object from the four >> DateTime::Span objects. Only now do I get what I intuitively thought I >> should get, namely, a SpanSet object with four elements. >> >> # VII: >> >> start: 2012-12-15 end: 2012-12-31 >> start: 2013-01-01 end: 2013-01-31 >> start: 2013-03-01 end: 2013-03-31 >> start: 2013-04-01 end: 2013-04-14 >> >> Am I using DateTime::SpanSet correctly? >> >> >> Thank you very much. >> Jim Keenan >> >