I remain happy to see until() go into the JDK. Potentially on more
classes than the recent PR.

*If* Java gets operator overloading, and *if* it is based on a mapping
to method names, then *perhaps* there is a case to consider adding
minus(). But I don't feel now is the time.

Stephen


On Thu, 16 May 2024 at 17:50, Kurt Alfred Kluever <k...@google.com> wrote:
>
> Hi all,
>
>
> Sorry for the delay here. I took a quick look at other popular date/time 
> libraries and there seems to be a fairly strong preference for minus (JS/TS's 
> Temporal library is the only other date/time library that I found which uses 
> until for this concept):
>
>
> Abseil's Time (C++) overloads the - (minus) operator to allow for end - start
>
> NodaTime (.NET) defines end.minus(start) (which also allows end - start)
>
> Kotlinx.datetime defines end.minus(start) (which also allows end - start)
>
> Python's date/time API allows end - start
>
> Temporal (JS/TS) defines start.until(end)
>
>
> The first 4 APIs support both instant - instant = duration and instant - 
> duration = instant — I find this quite natural.
>
>
> Additionally, "until" seems to imply it will return a positive duration. This 
> is fine if you're certain that "end" is after "start". However, it becomes 
> very confusing otherwise. E.g., if you ask: "how long from when you were 
> married until now?". If you were married 4 years ago, that makes sense. But 
> if your wedding is in 3 months, then the result is a negative duration (which 
> often cause confusion). If you ask the question the other way around ("how 
> long from now until your wedding day?"), that works if your wedding is in the 
> future, but not so much if you were married 4 years ago (again, you'll get a 
> negative duration).
>
>
> Additionally, the word "until" seems to imply a range with defined start/end 
> points; e.g., "I'm out from Tuesday until next Thursday" --- that's more of a 
> Range<Instant> (or an Interval which java.time doesn't have – but of course 
> JodaTime did), not just a span of time (a Duration).
>
>
> Does that sway anybody's opinion?
>
>
> Thanks,
>
> -kak
>
>
>
> On Mon, May 13, 2024 at 1:38 PM Naoto Sato <naoto.s...@oracle.com> wrote:
>>
>> Hi,
>>
>> With Stephen/Roger's comments, as well as Kevin's observation that
>> until(end) has a good argument ordering that is easy to understand, I'd
>> still propose `until()`. Please post if you have further comments.
>>
>> Naoto
>>
>> On 5/3/24 6:39 AM, Roger Riggs wrote:
>> > Hi,
>> >
>> > I would also reinforce Stephen's early observation that the pattern for
>> > "until" methods in java.time includes those of the XXXDate classes, with
>> > a single Temporal parameter.  Period and Duration are similar values
>> > holding relative TemporalAmounts.
>> >
>> >      public Period until(ChronoLocalDate endDateExclusive)
>> >
>> > In addition to Instant, the LocalTime class might also benefit from adding:
>> >
>> >      public Duration until(LocalTime endExclusive)`
>> >
>> > The API design of java.time included an emphasis on consistent naming
>> > across the packages.
>> >
>> > Regards, Roger
>> >
>> >
>> > On 5/2/24 4:01 PM, Naoto Sato wrote:
>> >> `Temporal` interface is clear that its `minus` methods return objects
>> >> of the same `Temporal` type, and `until` calculates the amount of time
>> >> until another `Temporal` type. Introducing `Instant.minus` that
>> >> returns `Duration` would be confusing to me.
>> >>
>> >> Naoto
>> >>
>> >> On 5/2/24 10:41 AM, Éamonn McManus wrote:
>> >>> I'd say too that this makes intuitive sense based on algebra. If we
>> >>> have:
>> >>> /instant1/ + /duration/ = /instant2/
>> >>> then we can subtract /duration/ from both sides:
>> >>> /instant1 = instant2 - duration/
>> >>> or we can subtract /instant1/ from both sides:
>> >>> /duration = instant2 - instant1/
>> >>>
>> >>> There's no manipulation we can do that would cause us to try to add
>> >>> instants together, and it's a bit surprising for the API to allow the
>> >>> first subtraction but not the second.
>> >>> I also think that if I see instant2.minus(instant1) it's immediately
>> >>> obvious to me what that means, while instant1.until(instant2) seems
>> >>> both less discoverable and less obvious.
>> >>>
>> >>> On Thu, 2 May 2024 at 10:29, Louis Wasserman <lowas...@google.com
>> >>> <mailto:lowas...@google.com>> wrote:
>> >>>
>> >>>     That doesn't follow for me at all.
>> >>>
>> >>>     The structure formed by Instants and Durations is an affine space
>> >>> <https://en.wikipedia.org/wiki/Affine_space#Definition>, with
>> >>>     instants the points and durations the vectors.  (An affine space is
>> >>>     a vector space without a distinguished origin, which of course
>> >>>     Instants don't have.)  It is 100% standard to use the minus sign for
>> >>>     the operation "point - point = vector," even when "point + point" is
>> >>>     not defined, and to use all the other standard idioms for
>> >>>     subtraction; the Wikipedia article uses "subtraction" and
>> >>>     "difference" ubiquitously.
>> >>>
>> >>>     Personally, I'd be willing to live with a different name for the
>> >>>     operation, but consider "users keep getting it wrong" a strong
>> >>>     enough argument all by itself for a version with the swapped
>> >>>     argument order; it's not obvious to me that another API with the
>> >>>     same argument order adds enough value over Duration.between to
>> >>>     bother with.
>> >>>
>> >>>     On Thu, May 2, 2024 at 10:04 AM Stephen Colebourne
>> >>>     <scolebou...@joda.org <mailto:scolebou...@joda.org>> wrote:
>> >>>
>> >>>         On Thu, 2 May 2024 at 15:58, Kurt Alfred Kluever <k...@google.com
>> >>> <mailto:k...@google.com>> wrote:
>> >>>          > instant − instant = duration // what we're discussing
>> >>>          > instant + duration = instant // satisfied by
>> >>>         instant.plus(duration)
>> >>>          > instant - duration = instant // satisfied by
>> >>>         instant.minus(duration)
>> >>>          > duration + duration = duration // satisfied by
>> >>>         duration.plus(duration)
>> >>>          > duration - duration = duration // satisfied by
>> >>>         duration.minus(duration)
>> >>>          > duration × real number = duration // satisfied by
>> >>>         duration.multipliedBy(long)
>> >>>          > duration ÷ real number = duration // satisfied by
>> >>>         duration.dividedBy(long)
>> >>>          >
>> >>>          > All but the first operation have very clear translations from
>> >>>         conceptual model to code. I'm hoping we can achieve the same
>> >>>         clarity for instant - instant by using the obvious name:
>> >>>         instant.minus(instant)
>> >>>
>> >>>         But you can't have
>> >>>           instant + instant = ???
>> >>>         It doesn't make sense.
>> >>>
>> >>>         This is at the heart of why minus isn't right in this case.
>> >>>         Stephen
>> >>>
>> >>>
>> >>>
>> >>>     --     Louis Wasserman (he/they)
>> >>>
>> >
>
>
>
> --
> kak

Reply via email to