Am 03.03.2021 um 11:53 schrieb Pierre <pierre-...@processus.org>:
> 
> Le 03/03/2021 à 11:37, Moritz Friedrich a écrit :
>> Hi internals,
>> I’ve been active in the PHP ecosystem as @Radiergummi for quite a while now, 
>> but not on internals yet, so: nice to meet you all!
>> 
>> I would like to propose adding a `__toString()` method to the `DateInterval` 
>> class that should return a valid ISO8601 interval 
>> (https://en.wikipedia.org/wiki/ISO_8601#Time_intervals). As it stands, the 
>> class supports creating instances from such interval strings passed to its 
>> constructor, but the reverse isn’t true: The only way to build a string 
>> representation of the interval is by querying the `DateInterval::format` 
>> method for the individual durations multiple times (see 
>> https://stackoverflow.com/questions/33787039/format-dateinterval-as-iso8601#answers
>>  for examples).
>> 
>> Allowing to cast `DateInterval`s to strings would make the most sense in my 
>> opinion, and probably doesn’t break BC. Use cases include communicating with 
>> other APIs that work with ISO8601, or persistence of periods in databases, 
>> for example.
>> 
>> So instead of the following:
>> 
>>     function formatDateInterval(DateInterval $interval, string $default = 
>> 'PT0S'): string {
>>         return rtrim(str_replace(
>>             ['M0S', 'H0M', 'DT0H', 'M0D', 'P0Y', 'Y0M', 'P0M'],
>>             ['M', 'H', 'DT', 'M', 'P', 'Y', 'P'],
>>             $interval->format('P%yY%mM%dDT%hH%iM%sS')
>>         ), 'PT') ?: $default;
>>     }
>>          formatDateInterval(new DateInterval('P1DT5H')) === 'P1DT5H'
>> 
>> I’d like to be able to do this:
>> 
>>     (string)new DateInterval('P1DT5H') === 'P1DT5H'
>> 
>> Following alternative approaches come to mind:
>> 
>> 1. Adding a new, specialized method to the class (eg. 
>> `DateInterval::toIsoString(): string`):
>>    While being the most BC-safe option, this would be completely different 
>> to the rest of the PHP date APIs.
>> 
>> 2. Adding a new interval format constant to be passed to 
>> `DateInterval::format` (eg. `DATE_INTERVAL_ISO8601`):
>>    Most in line with the `DateTime` API, but probably requires special case 
>> handling in `format` code.
>> 
>> From those, having `__toString` seems most desirable to me.
>> While I’m not proficient with C, I’d really like to see this implemented and 
>> would gladly help out where I can. Might someone be able to advise?
>> 
>> 
>> Sincerely
>> Moritz / Radiergummi
> 
> Hello,
> 
> I don't like implicit __toString() methods, they have to be very carefully 
> documented and it's "magic". Wouldn't it be best to have both the 
> `toIsoString()` and `__toString()` (as a fallback) methods ?
> 
> Having the constant is a good idea too, it would make it probably more 
> consistent with the DateTime class, I'm not opposed having three variations 
> to do skin the same cat.
> 
> Regards,
> 
> Pierre
> 
> -- 
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
> 

Hi Pierre,

Having `__toString` proxy to `toIsoString` internally sounds like a good idea, 
but I’m not too fond of the constant - all other built-in date constants 
translate to a string of plain format characters, which isn’t possible in this 
case, so it would be meaningless everywhere else.

Sincerely,
Moritz

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to