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