This overlooks part of the original proposal which included potential 
optimizations. I don't know what they would be, but I think the idea is that 
certain
Datetime functions might be optimizable if they don't have to start from "any 
given datetime" but can know that they are starting from "now".

> On Jan 8, 2025, at 12:22 PM, Allen Madsen <allen.c.mad...@gmail.com> wrote:
> 
> It seems like the goal is just to have a shorter way to express utc_now and 
> utc_today, because otherwise this code is the same:
> 
> Date.shift(Date.utc_today(), month: 1)
> Date.shift(:utc_today, month: 1)
> 
> Two ideas come to mind besides supporting the atom, that would just give you 
> a Date/DateTime to use here that could be shorter.
> 
> * Change what the sigils support ~D[utc_today]/~U[utc_now]
> * Make utc_today/0 and utc_now/2 Kernel functions.
> 
> Allen Madsen
> http://www.allenmadsen.com <http://www.allenmadsen.com/>
> 
> On Wed, Jan 8, 2025 at 11:39 AM Zach Daniel <zachary.s.dan...@gmail.com 
> <mailto:zachary.s.dan...@gmail.com>> wrote:
>> I didn't mean that we would make a struct that people could pretend was a 
>> datetime and do things like call `.year` on it. I meant that if we are using 
>> a "magic value" we could make the "magic value" be something that can be 
>> expanded over time.
>> 
>> For example, if I want to make a function that takes "a thing that can be 
>> passed into `DateTime.shift`", it is much easier if I can say `DateTime.t() 
>> | DateTime.Lazy.t()` etc. Don't we have
>> similar treatment for `Regex`? Like the internals aren't meant to be pattern 
>> matched on/used, but it can be accepted by internal functions.
>> 
>> If we're sure there will only ever be one such atom then I guess it makes 
>> sense, but if I wanted go guard against "something that DateTime accepts" it 
>> feels like `when is_struct(datetime, DateTime) or is_struct(datetime, 
>> DateTime.Lazy)` would future proof that guard, where as `when 
>> is_struct(datetime, DateTime) or datetime == :utc_now` wouldn't.
>> 
>>> On Jan 8, 2025, at 11:10 AM, José Valim <jose.va...@gmail.com 
>>> <mailto:jose.va...@gmail.com>> wrote:
>>> 
>>> The problem is that the struct fields are public and we can't make them 
>>> lazy. So if the user does `DateTime.lazy(:utc_now).year`, it won't work, 
>>> and if the only use of said lazy types is to pass it to these functions, we 
>>> might as well make it an atom specific to these functions. :)
>>> 
>>> 
>>> José Valim
>>> https://dashbit.co/
>>> 
>>> 
>>> On Wed, Jan 8, 2025 at 4:46 PM Zachary Daniel <zachary.s.dan...@gmail.com 
>>> <mailto:zachary.s.dan...@gmail.com>> wrote:
>>>> DateTime.shift(DateTime.lazy(:utc_now), duration)
>>>> 
>>>> Doesn’t have the same feel of convenience but it seems to me to be a more 
>>>> resilient option.
>>>> 
>>>>> On Jan 8, 2025, at 10:44 AM, Zachary Daniel <zachary.s.dan...@gmail.com 
>>>>> <mailto:zachary.s.dan...@gmail.com>> wrote:
>>>>> 
>>>>> 
>>>>> I’m wondering if an opaque struct may be better, representing a 
>>>>> computed-on-demand datetime. Like `%DateTime.Lazy{}`. Then it could grow 
>>>>> over time without needing to expand a set of magic atoms.
>>>>> 
>>>>>> On Jan 8, 2025, at 10:37 AM, 'Billy Lanchantin' via elixir-lang-core 
>>>>>> <elixir-lang-core@googlegroups.com 
>>>>>> <mailto:elixir-lang-core@googlegroups.com>> wrote:
>>>>>> 
>>>>>> 
>>>>>> I like the functionality and neither option seems like the obvious 
>>>>>> choice. I agree with José here:
>>>>>> 
>>>>>> > 2. If we go [the dedicated function] route, we may find ourselves 
>>>>>> > adding other functions, such as `add_to_utc_now` and `diff_to_utc_now`.
>>>>>> 
>>>>>> So I somewhat favor `Date.shift(:utc_today, month: 1)`. It's naturally 
>>>>>> extensible to other bases (like `:now`, `:utc_now`) without polluting 
>>>>>> the temporal modules with helpers.
>>>>>> 
>>>>>> The downside is that the types will be more awkward. `DateTime.shift/2` 
>>>>>> and friends will accept either a struct or one of a set of special 
>>>>>> atoms. So we're stuck increasing the either size of the types or the 
>>>>>> number functions.
>>>>>> 
>>>>>> ---
>>>>>> 
>>>>>> What does the `Date.range(date, duration)` return?
>>>>>> On Wednesday, January 8, 2025 at 8:02:45 AM UTC-5 José Valim wrote:
>>>>>>> Another scenario where :utc_now could be used is DateTime.after?(date, 
>>>>>>> :utc_now)
>>>>>>> 
>>>>>>> 
>>>>>>> José Valim
>>>>>>> https://dashbit.co/
>>>>>>> 
>>>>>>> 
>>>>>>> On Wed, Jan 8, 2025 at 1:57 PM Jon Rowe <ma...@jonrowe.co.uk <>> wrote:
>>>>>>>> I'd love either of these proposals to be a reality, I often find 
>>>>>>>> myself building my own helpers in tests to do this sort of thing.
>>>>>>>> 
>>>>>>>> Initially I thought the function varient was better but if you look at 
>>>>>>>> it as "then we might have to add all these other functions" I found 
>>>>>>>> myself leaning towards allowing `:utc_now` as a placeholder in the 
>>>>>>>> existing api, it might be slightly more verbose but it leans towards a 
>>>>>>>> more compact core api overall... so that gets my +1.
>>>>>>>> 
>>>>>>>> Cheers
>>>>>>>> Jon
>>>>>>>> 
>>>>>>>> On Wed, 8 Jan 2025, at 11:06 AM, José Valim wrote:
>>>>>>>>> I'd love to see something along those lines but I can't pick a 
>>>>>>>>> favorite.
>>>>>>>>> 
>>>>>>>>> 1. Supporting :utc_now in "shift" could be a welcome addition, as we 
>>>>>>>>> could also support it in "add" and "diff" functions. However, I'd say 
>>>>>>>>> it is more verbose than from_utc_today.
>>>>>>>>> 
>>>>>>>>> 2. from_utc_now/from_utc_today is clearer but less applicable. If we 
>>>>>>>>> go this route, we may find ourselves adding other functions, such as 
>>>>>>>>> `add_to_utc_now` and `diff_to_utc_now`.
>>>>>>>>> 
>>>>>>>>> So I would love to hear everyone's thoughts.
>>>>>>>>> 
>>>>>>>>> "Date.range/2" with a duration is a no-brainer though and we could 
>>>>>>>>> add it today.
>>>>>>>>> 
>>>>>>>>> José Valim
>>>>>>>>> https://dashbit.co/
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> On Tue, Jan 7, 2025 at 5:43 PM Wojtek Mach <woj...@wojtekmach.pl <>> 
>>>>>>>>> wrote:
>>>>>>>>> Hello,
>>>>>>>>> 
>>>>>>>>> I'd like to propose adding the following functions:
>>>>>>>>> 
>>>>>>>>> - `Date.from_utc_today(duration)`
>>>>>>>>> - `NaiveDateTime.from_utc_today(duration)`
>>>>>>>>> - `DateTime.from_utc_today(duration)`
>>>>>>>>> 
>>>>>>>>> For example:
>>>>>>>>> 
>>>>>>>>>     # Say, now is ~U[2025-01-07 16:22:40.003901Z]
>>>>>>>>> 
>>>>>>>>>     iex> Date.from_utc_now(month: 1, day: 1)
>>>>>>>>>     ~D[2025-02-08]
>>>>>>>>> 
>>>>>>>>>     iex> NaiveDateTime.from_utc_now(hour: -1)
>>>>>>>>>     ~N[2025-01-07 15:22:40.003901]
>>>>>>>>> 
>>>>>>>>>     iex> DateTime.from_utc_now(Duration.new!(hour: 1))
>>>>>>>>>     ~U[2025-01-07 17:22:40.003901Z]
>>>>>>>>> 
>>>>>>>>> I believe they are especially useful when writing tests and they 
>>>>>>>>> might give opportunity for some optimizations.
>>>>>>>>> 
>>>>>>>>> Another idea is to instead allow passing `:utc_today` / `:utc_now` to 
>>>>>>>>> the existing shift/2 functions:
>>>>>>>>> 
>>>>>>>>>     iex> Date.shift(:utc_today, month: 1, day: 1)
>>>>>>>>>     ~D[2025-02-08]
>>>>>>>>> 
>>>>>>>>>     iex> NaiveDateTime.shift(:utc_now, hour: -1)
>>>>>>>>>     ~N[2025-01-07 15:22:40.003901]
>>>>>>>>> 
>>>>>>>>>     iex> DateTime.from_utc_now(:utc_now, hour: 1)
>>>>>>>>>     ~U[2025-01-07 17:22:40.003901Z]
>>>>>>>>> 
>>>>>>>>> Btw and this is a related but separate conversion, I think a 
>>>>>>>>> `Date.range(date, duration)` would be a nice addition. And so, I 
>>>>>>>>> believe a `Date.range(:utc_today, month: 1)` would be a natural 
>>>>>>>>> extension of this. I'm not sure if supporting `Date.add(:utc_today, 
>>>>>>>>> 1)` and similar is worth it, perhaps just for consistency.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> --
>>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>>> Groups "elixir-lang-core" group.
>>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>>> send an email to elixir-lang-co...@googlegroups.com <>.
>>>>>>>>> To view this discussion visit 
>>>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/2851ea28-d20e-4e8d-b957-38a582f7fa39n%40googlegroups.com
>>>>>>>>>  
>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/2851ea28-d20e-4e8d-b957-38a582f7fa39n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> --
>>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>>> Groups "elixir-lang-core" group.
>>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>>> send an email to elixir-lang-co...@googlegroups.com <>.
>>>>>>>>> To view this discussion visit 
>>>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4L9iSWc7zD8v_%2BqNhsOhx10atYksuPO5gbGCMvvz88sPA%40mail.gmail.com
>>>>>>>>>  
>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4L9iSWc7zD8v_%2BqNhsOhx10atYksuPO5gbGCMvvz88sPA%40mail.gmail.com?utm_medium=email&utm_source=footer>.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> -- 
>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>> Groups "elixir-lang-core" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>>>>> an email to elixir-lang-co...@googlegroups.com <>.
>>>>>>> 
>>>>>>>> To view this discussion visit 
>>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/3952efd8-06a4-4855-9277-8208b5c8068f%40app.fastmail.com
>>>>>>>>  
>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/3952efd8-06a4-4855-9277-8208b5c8068f%40app.fastmail.com?utm_medium=email&utm_source=footer>.
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "elixir-lang-core" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>>> an email to elixir-lang-core+unsubscr...@googlegroups.com 
>>>>>> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
>>>>>> To view this discussion visit 
>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/d1c3407a-5c4c-4978-a813-43eaf9711554n%40googlegroups.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/d1c3407a-5c4c-4978-a813-43eaf9711554n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>>>> 
>>>> 
>>>> -- 
>>>> You received this message because you are subscribed to the Google Groups 
>>>> "elixir-lang-core" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>>> email to elixir-lang-core+unsubscr...@googlegroups.com 
>>>> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
>>>> To view this discussion visit 
>>>> https://groups.google.com/d/msgid/elixir-lang-core/CF7D089E-DBB9-432A-B15D-4EB5DFB046DB%40gmail.com
>>>>  
>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CF7D089E-DBB9-432A-B15D-4EB5DFB046DB%40gmail.com?utm_medium=email&utm_source=footer>.
>>> 
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "elixir-lang-core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to elixir-lang-core+unsubscr...@googlegroups.com 
>>> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
>>> To view this discussion visit 
>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4K0q1dOWpFxNH%2BxAsdJpt_G9DA-BDGJqeYxOTgD-AuDQg%40mail.gmail.com
>>>  
>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4K0q1dOWpFxNH%2BxAsdJpt_G9DA-BDGJqeYxOTgD-AuDQg%40mail.gmail.com?utm_medium=email&utm_source=footer>.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-core+unsubscr...@googlegroups.com 
>> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
>> To view this discussion visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/7390B51F-96B5-44C3-8896-85B171EFB4C7%40gmail.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/7390B51F-96B5-44C3-8896-85B171EFB4C7%40gmail.com?utm_medium=email&utm_source=footer>.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to elixir-lang-core+unsubscr...@googlegroups.com 
> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
> To view this discussion visit 
> https://groups.google.com/d/msgid/elixir-lang-core/CAK-y3CuyeAjpoTqA44X%2B97wgfZOFbF8Q%3DvoA6uMGrut-U_RdyA%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/elixir-lang-core/CAK-y3CuyeAjpoTqA44X%2B97wgfZOFbF8Q%3DvoA6uMGrut-U_RdyA%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/elixir-lang-core/3725EBE6-E269-42C8-B787-C8D8FDFF63FC%40gmail.com.

Reply via email to