Ciao Alex_70 il codice è buono mentre la funzione diff non tanto.
Se si presenta un timezone "positivo" da inizio a fine mese non darà il risultato sperato poiché la funzione converte a UTC cioè a 0 il timezone. Anche se imposti UTC come timezone avrai solo l'illusione di calcolare una data poiché non verra applicato il DST o ST (in realtà il calcolo non viene applicato nemmeno al timezone "positivo" o "negativo").
Per rispondere al tuo problema ti faccio notare l'aritmetica DateTime il calcolo di + 1 month è riferito al mese corrente (+28 se febbraio non bisestile, +29 se febbraio bisestile, +30 se aprile, giugno , settembre, novembre altrimenti +31 se gennaio, marzo maggio, luglio, agosto, ottobre, dicembre) quindi con un'esempio start Europe/Rome 2011-01-01 00-00-00 viene trasformato in UTC 2010-12-31 23:00:00 ST +01:00 mentre end Europe/Rome 2012-01-01 00:00:00 viene trasformato in UTC 2011-12-31 23:00:00 ST +01:00.
Start 31 dicembre (+ 1 month 31 giorni), primo mese 31 gennaio (+ 1 month 31 giorni), secondo mese 28 febbraio (+ 1 month 31 giorni riferito a gennaio),
terzo mese 31 marzo (+ 1 month 31 giorni), quarto mese 30 aprile (+ 1 month 30 giorni), quinto mese 31 maggio (+ 1 month 31 giorni), sesto mese 30 giugno (+ 1 month 30 giorni), settimo mese 31 luglio (+ 1 month 31 giorni), ottavo mese 31 agosto (+ 1 month 31 giorni), nono mese 30 settembre (+ 1 month 30 giorni), decimo mese 31 ottobre (+ 1 month 31 giorni), undicesimo mese 30 novembre (+ 1 month 30 giorni), dodicesimo mese 31 dicembre (+ 1 month 31 giorni).
Voglio vedere questo bug puoi fare copia/incolla del risultato di uno script php in questo forum?
PHP:
header("Content-Type: text/plain");
$default1 = date_create("now");
$default2 = date_default_timezone_get();
$timezone = timezone_open('Europe/Rome');
$date_start = new DateTime('2011-01-01 00:00:00', $timezone);
$date_end = new DateTime('2012-01-01 00:00:00', $timezone);
var_dump($default1, $default2, ($date_start->getTimestamp()), ($date_end->getTimestamp()), ($date_start->diff($date_end)), $date_start, $date_end);
Che produce tale output:
Codice:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2020-07-10 15:22:14.819623"
["timezone_type"]=>
int(3)
["timezone"]=>
string(11) "Europe/Rome"
}
string(11) "Europe/Rome"
int(1293836400)
int(1325372400)
object(DateInterval)#5 (16) {
["y"]=>
int(1)
["m"]=>
int(0)
["d"]=>
int(0)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["f"]=>
float(0)
["weekday"]=>
int(0)
["weekday_behavior"]=>
int(0)
["first_last_day_of"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
int(365)
["special_type"]=>
int(0)
["special_amount"]=>
int(0)
["have_weekday_relative"]=>
int(0)
["have_special_relative"]=>
int(0)
}
object(DateTime)#3 (3) {
["date"]=>
string(26) "2011-01-01 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(11) "Europe/Rome"
}
object(DateTime)#4 (3) {
["date"]=>
string(26) "2012-01-01 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(11) "Europe/Rome"
}
Dovrebbe differire solamente l'orario e forse il tuo timezone iniziale... penso sia un problema di DST.