Visualizzazione risultati 1 fino 3 di 3

Discussione: DateTime::diff momento o conversione a UTC

  1. #1
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito DateTime::diff momento o conversione a UTC

    Qui vi espongo una mia perplessità, nonché DateTime::diff da php 8.1.x. Voi cosa ne pensate?
    php per le date o/e time adotta la convenzione GNU.
    L'aritmetica non è 1 a 1, ma piuttosto per esempio +1 month dipende dal mese (se ad esempio 2021-01-01 +00:00, significa tra 31 giorni il che è 2021-03-03 +00:00) o next month che riporta al mese prossimo del giorno usato dalla data. da 2021-01-31 +00:00 a 2021-03-03 +00:00 (poiché il mese di gennaio in questione è 31 ma febbraio arriva a 28). Differente è la gestione della sintassi php 5.3 di first day of next month.

    Questa premessa è per spiegare velocemente il concetto.
    Da php 8.1.x è in considerazione il momento espresso non la conversione a UTC.
    Codice PHP:
    $date_start = new \DateTime('2021-03-01', new \DateTimeZone('Europe/Rome'));
    $date_end = new \DateTime('2021-07-29', new \DateTimeZone('Europe/Rome'));

    $interval = $date_start->diff($date_end);

    print_r($interval);
    /*Risultato atteso
    DateInterval Object
    (
    [y] => 0
    [m] => 4
    [d] => 28
    [h] => 0
    [i] => 0
    [s] => 0
    [f] => 0
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 150
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
    )*/
    mentre per me è errato pensarlo a 5 mesi (giustamente con la conversione a UTC).
    Anche se effettivamente 4 mesi e 28 giorni esatti sono a 2021-7-29 01:00:00 Daylight Saving Time, ma va beh è tutt'altro discorso.
    Ultima modifica di darbula : 29-07-2021 alle ore 15.19.35

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Si tratta di un bug noto di DateTime::diff: https://bugs.php.net/bug.php?id=52480
    Ha a che fare con le timezones.

  3. #3
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Grazie per il messaggio.
    Certo concordo, la data locale in uso 2021-01-01 00:00:00+01:00 (Europe/Rome) va conteggiata per essa e non per 2020-12-31 23:00:00+00:00 (UTC).
    Anche se in realtà il manuale php dovrebbe affermare non sempre il processo è riproducibile ma diff va usata per ogni iterazione poiché l'aritmetica potrebbe essere variabile.
    Altrimenti chi non produce il codice per creare la funzione diff non ne conosce le debolezze.
    Ultima modifica di darbula : 30-07-2021 alle ore 15.14.00

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •