It is still on the list of things that I think should be done in 
Joda-Time. But its not something I'm working on right now. I still think 
it should be in the DateTimeField though, even if it does avoid 
timezones somehow.

If you need this now though, I suggest you use the code I replied with 
to knock up a solution for your requirements.

Stephen


Mike Whittaker wrote:
> Well can't you side step the timezone issue, implement it in the
> ReadablePartials
> and leave it to the client programmer to convert to timezone savvy
> instances,
> aware of the issues. Or am I being naive?
> If it's about there, I'd sure appreciate it. I seem to want to do this kind
> of
> thing alot.
> 
> --
> Mike W
> 
> 
>> Hi Mike,
>> This looks like something I tried to implement a while back -
>> nextMatching(). That is, given a DateTime, find the next DateTime that
>> matches the given Partial.
>>
>> I got this working for dates, but I ran into problems with timezones.
>> Timezones were essentially unpredictable, and confused the definition of
>> what 'next matching' meant (eg. when DST rules lead to overlapping
>> hours). As a result, I stopped work on this concept.
>>
>> This is some of the code I wrote, and was on the BaseDateTimeField
>> class. It was then overridden in subclasses to improve performance.
>>
>> Basically, if we only implemented this for the Local* classes, then this
>> would be easy. Its the timezone thats the hard problem to solve.
>>
>> Stephen
>>
>>
>>
>> //------------------------------------------------------------------------
>>      /**
>>       * Finds the next instant that the input instant has the specified
>> value.
>>       * <p>
>>       * The value of this field will be set into the input milliseconds.
>>       * The result will always be after the input milliseconds.
>>       * If the value is invalid, an exception if thrown.
>>       * <p>
>>       * Finding the next match avoids changing other fields, especially
>> smaller
>>       * sized ones. For exampe, finding the next 30th dayOfMonth after
>> the 31st
>>       * January will return the 31st March. The time fields will be
>> unaltered.
>>       *
>>       * @param instant  the milliseconds from
>> 1970-01-01T00:00:00Z to set in
>>       * @param value  the value to set, in the units of the field
>>       * @param numberOfRanges  the number of ranges to move by, zero has
>> no effect
>>       * @param firstMustChange  whether the set must change the date
>>       * @return the updated milliseconds
>>       * @throws IllegalArgumentException if the value is invalid
>>       * @since 1.3
>>       */
>>      public long next(long instant, int value, int numberOfRanges,
>> boolean firstMustChange) {
>>          if (numberOfRanges == 0) {
>>              return instant;
>>          }
>>          long millis = set(instant, value);
>>          if (numberOfRanges > 0) {
>>              if (millis > instant || (millis == instant &&
>> !firstMustChange)) {
>>                  numberOfRanges--;
>>              }
>>              if (numberOfRanges > 0) {
>>                  millis = findNext(millis, value, numberOfRanges);
>>              }
>>          } else {
>>              if (millis < instant || (millis == instant &&
>> !firstMustChange)) {
>>                  numberOfRanges++;
>>              }
>>              if (numberOfRanges < 0) {
>>                  millis = findNext(millis, value, numberOfRanges);
>>              }
>>          }
>>          return millis;
>>      }
>>
>>      /**
>>       * Finds the next/previous occurrance of a value.
>>       *
>>       * @param millis  the milliseconds with a field value equal to value
>>       * @param value  the value to progress to
>>       * @param numberOfRanges  the number of progressions, non-zero
>>       * @return the updated millis
>>       * @since 1.3
>>       */
>>      protected long findNext(long millis, int value, int numberOfRanges) {
>>          DurationField range = getRangeDurationField();
>>          if (range == null || range.isSupported() == false) {
>>              throw new IllegalFieldValueException(getType(),
>> Integer.toString(value));
>>          }
>>          int sgn = 1;
>>          if (numberOfRanges < 0) {
>>              sgn = -1;
>>              numberOfRanges = -numberOfRanges;
>>          }
>>          // need to handle varying unit/range lengths
>>          long base = millis;
>>          for (int j = sgn; numberOfRanges > 0; j += sgn) {
>>              millis = range.add(base, j);
>>              if (get(millis) == value) {
>>                  numberOfRanges--;
>>              }
>>          }
>>          return millis;
>>      }
>>
>>
>>
>>
>>
>> reece wrote:
>>> Hi Joda People,
>>>
>>> Pleases us this API generally does ;-)
>>>
>>> The bottom line (I think) is - How do I 'roll' a DateTime forward to the
>>> next
>>> occuring Partial (eg 1st October)?
>>>
>>> Some other details follow that illustrate the higher problem in
>> case there
>>> is a better approach...
>>>
>>> My highish aim is:
>>> I have MyPartial of 1st October with just those fields set.
>>> I wish to split MyInterval around MyPartial, if of course it
>> contains it.
>>> I don't see any ambiguity there.
>>>
>>> 2006-01-01 - 2007-07-01 false
>>> 2007-07-01 - 2007-10-02 true
>>>
>>> There must be a simpler way but at the moment I'm going through this
>>> procedure.
>>>
>>> Sub aim: Convert MyPartial to DateTime of the next year after
>>> MyInterval.start
>>> So I expected to be able to do some rounding to achieve this - I drew a
>>> blank.
>>> Instead I can first artificially add 3 months (1,Jan minus 1,Oct) to
>>> MyInterval.start and then roundFloor() the year - this gives a
>> year I can
>>> extract and set on MyPartial, allowing a meaningful MyInstant to be
>>> extracted.
>>>
>>> Using this the following all result in the correct year to set
>> on MyPartial
>>> in order to give me a date I can split MyInterval around.
>>>
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> MyInterval.start:    Wed 1 Nov '06
>>> plusMonths(3):       Thu 1 Feb '07
>>> year().roundFloor(): Mon 1 Jan '07
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> MyInterval.start:    Thu 1 Feb '07
>>> plusMonths(3):       Tue 1 May '07
>>> year().roundFloor(): Mon 1 Jan '07
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> MyInterval.start:    Sun 1 Jul '07
>>> plusMonths(3):       Mon 1 Oct '07
>>> year().roundFloor(): Mon 1 Jan '07
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> MyInterval.start:    Sun 30 Sep '07
>>> plusMonths(3):       Sun 30 Dec '07
>>> year().roundFloor(): Mon 1 Jan '07
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> MyInterval.start:    Mon 1 Oct '07
>>> plusMonths(3):       Tue 1 Jan '08
>>> year().roundFloor(): Tue 1 Jan '08
>>>
>>> The problem is, calculating the 3 month period (or whatever period that
>>> is depending on MyPartial) since MyPartial may be any point in the year.
>>> I see I can do:
>>> Days.daysBetween(ReadablePartial start,ReadablePartial end)
>>> Which may help but if MyPartial is < 29 Feb then this is going to cause
>>> error. In fact I expect that method would fallover without year
>> field in the
>>> Partial.
>>>
>>> So the bottom line is - how do I roll a DateTime forward to the next
>>> occuring Partial?
>>>
>>> Thanks,
>>> Mike W
>>>
>>> P.S. Fantastic API - I'll never use that festering JDK library again!!
>>>
>>>
>>>
>>>
>>>
>> -------------------------------------------------------------------------
>>> Take Surveys. Earn Cash. Influence the Future of IT
>>> Join SourceForge.net's Techsay panel and you'll get the chance
>> to share your
>>> opinions on IT & business topics through brief surveys - and earn cash
>>>
>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>>> _______________________________________________
>>> Joda-interest mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/joda-interest
>>>
>> -------------------------------------------------------------------------
>> Take Surveys. Earn Cash. Influence the Future of IT
>> Join SourceForge.net's Techsay panel and you'll get the chance to
>> share your
>> opinions on IT & business topics through brief surveys - and earn cash
>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>> _______________________________________________
>> Joda-interest mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/joda-interest
>>
> 
> 
> 
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Joda-interest mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/joda-interest
> 

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Joda-interest mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/joda-interest

Reply via email to