Yes, let’s do option 3 as well. And now that I think more about it, we
should just pass whatever is given to strftime as first argument to the
anonymous function depending on the arity. That should cover all bases.



*José Valimhttps://dashbit.co/ <https://dashbit.co/>*


On Fri, Jan 31, 2025 at 08:08 Kip <kipco...@gmail.com> wrote:

> José, thank you. I have implemented Cldr.Calendar.strftime/2 as you
> suggested and published it as part of ex_cldr_calendars 2.0.  With your
> agreement I'll submit a PR for option (3) for core team consideration.
>
> On Thursday, January 30, 2025 at 7:53:16 PM UTC+11 José Valim wrote:
>
>> > Yes, the same issue with month of year which I mentioned briefly above.
>>
>> Do we have the same issue with "month of year" in that it is representing
>> the cardinal month instead of the ordinal one?
>>
>> > Option (4) isn't ideally in scope for ex_cldr since
>> Cldr.DateTime.to_string/3 is the canonical CLDR standard formatter.
>>
>> WDYM? If that's the standard formatter, does it call Calendar.strftime
>> behind the scenes? Regardless, could you add Cldr.DateTime.strftime or
>> would that violate some CLDR API rule/principles?
>>
>> ---
>>
>> Option 3 is something we could accept in Elixir but option 4 means you
>> can deliver the feature today, rather than in ~4 months. :)
>>
>>
>> *José Valimhttps://dashbit.co/ <https://dashbit.co/>*
>>
>>
>> On Thu, Jan 30, 2025 at 9:48 AM Kip <kipc...@gmail.com> wrote:
>>
>>> > However, I believe the issue above is not specific to day_of_week?
>>>
>>> Yes, the same issue with month of year which I mentioned briefly above.
>>> So I don't believe option (1) and (2) would work for month of year.
>>>
>>> Option (3) would be my preference, but arity-checking isn't beautiful I
>>> agree.
>>> Option (4) isn't ideally in scope for ex_cldr since
>>> Cldr.DateTime.to_string/3 is the canonical CLDR standard formatter.
>>>
>>> If (1) and (2) won't work (because of the same issue for both day of
>>> week and month of year) and (3) and (4) aren't considered acceptablethen:
>>>
>>> (a) I'll submit a PR to update the documentation for strftime/3 to note
>>> the behaviour when the calendars first day of week isn't Monday
>>> (b) I'll Document in ex_cldr_calendars the importance of passing in a
>>> calendar to `MyApp.Cldr.Calendar.strftime_options!/1` for localised
>>> calendars
>>>
>>> On Thursday, January 30, 2025 at 6:32:41 PM UTC+11 José Valim wrote:
>>>
>>>> I can think of a few options:
>>>>
>>>> 1. Make day_of_week return a cardinal value in this case by passing
>>>> :monday as argument to Date.day_of_week
>>>> 2. Same as above but make the starting day_of_week an option, so you
>>>> could return starting_day_of_week as part of your options (and you will
>>>> probably default to :monday on all of them anyway)
>>>>
>>>> However, I believe the issue above is not specific to day_of_week? If
>>>> it is not:
>>>>
>>>> 3. Change all callbacks functions in strftime to optionally receive a
>>>> calendar. We could check the function arity and dispatch accordingly
>>>> 4. Same as above but you do it in CLDR.strftime, which you add, and
>>>> wrap all functions to receive the Calendar
>>>>
>>>> My preference, for simplicity, would be 1 or 2, probably 2 for
>>>> backwards compatibility.
>>>>
>>>> *José Valimhttps://dashbit.co/ <https://dashbit.co/>*
>>>>
>>>>
>>>> On Thu, Jan 30, 2025 at 3:20 AM Kip <kipc...@gmail.com> wrote:
>>>>
>>>>> Hmm, I suppose the flaw in my argument is that the optional argument
>>>>> functions aren't really callbacks, and they are part of the public API.
>>>>> Which means this is a breaking change for anyone using a function value 
>>>>> for
>>>>> an option.
>>>>>
>>>>> On Thursday, January 30, 2025 at 12:52:42 PM UTC+11 Kip wrote:
>>>>>
>>>>>> *Proposal summary*
>>>>>>
>>>>>> Change the callback function signature for `Calendar.strftime/3`
>>>>>> options to pass both a number and the first arguments calendar.
>>>>>>
>>>>>> *Explanation*
>>>>>>
>>>>>> Today `Calendar.strftime/3` allows a function to be provided as an
>>>>>> option to any of the keywords. This is very helpful when working with
>>>>>> localised calendars because a simple function call can return all the 
>>>>>> data
>>>>>> relevant to the localised date.  For example:
>>>>>>
>>>>>> iex> Calendar.strftime ~D[2020-01-30 Cldr.Calendar.US], "%a",
>>>>>> MyApp.Cldr.Calendar.strftime_options!()
>>>>>> “Fri"
>>>>>>
>>>>>> But there’s an issue:  That date is actually a Thursday, not Friday!
>>>>>> So what’s going on?  Internally `Calendar.strftime/3` is calling
>>>>>> `Date.day_of_week/1`. That function returns a number representing the nth
>>>>>> day of the calendar-relative week (so-called ordinal day).  There is the
>>>>>> same issue with month of year because not all calendars start in January.
>>>>>> For example, the Australia tax year calendar starts in July.
>>>>>>
>>>>>> Since the US official calendar starts its weeks on Sunday - unlike
>>>>>> Calendar.ISO which starts its weeks on Monday (like many territories) - 
>>>>>> the
>>>>>> day name lookup failed to show the correct result. This is because the
>>>>>> callback didn’t have the calendar context to know what the default
>>>>>> start-of-week day is.
>>>>>>
>>>>>> Now that can be worked around by specifying the calendar in 
>>>>>> MyApp.Cldr.Calendar.strftime_options!/1
>>>>>> like this:
>>>>>>
>>>>>> iex> Calendar.strftime ~D[2020-01-30 Cldr.Calendar.US], "%a",
>>>>>> MyApp.Cldr.Calendar.strftime_options!(calendar: Cldr.Calendar.US)
>>>>>> “Thu"
>>>>>>
>>>>>> But that feels an error prone. Perhaps it would be better to pass the
>>>>>> calendar of the date/datetime/time argument to the callback functions
>>>>>> instead?  Today those functions receive a number only. This proposal is 
>>>>>> to
>>>>>> have the functions receive both a number and the calendar of the first
>>>>>> argument (which might be nil). This would give appropriate context to 
>>>>>> the 4
>>>>>> out of the 5 callback functions that would benefit from it (2 each for
>>>>>> month name and day names).
>>>>>>
>>>>>> *Precedent*
>>>>>>
>>>>>> This would be a breaking change for the callback signature - but not
>>>>>> for the Calendar.strftime/3 public function.  There is some limited
>>>>>> precendent. For example when the `Calendar.day_of_week/3` callback 
>>>>>> changed
>>>>>> to be `Calendar.day_of_week/4`. That change affected the implementation 
>>>>>> of
>>>>>> alternative calendars, but it did not affect consumers of those 
>>>>>> calendars.
>>>>>>
>>>>> --
>>>>> 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/583251f8-b182-4133-8a9d-03bc3b96ae74n%40googlegroups.com
>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/583251f8-b182-4133-8a9d-03bc3b96ae74n%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/be73d5e9-2451-48c9-a718-5a961eebfc48n%40googlegroups.com
>>> <https://groups.google.com/d/msgid/elixir-lang-core/be73d5e9-2451-48c9-a718-5a961eebfc48n%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.
> To view this discussion visit
> https://groups.google.com/d/msgid/elixir-lang-core/154e46b6-b7c7-4f64-8e4a-c41140767bcfn%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-core/154e46b6-b7c7-4f64-8e4a-c41140767bcfn%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.
To view this discussion visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4JbspQh%2BgmEeAhYCwbPCG_ukeDMKsJKdNvwDY79T5HgLA%40mail.gmail.com.

Reply via email to