HOWTO · PHP
Ottieni la differenza di orario in minuti in PHP
Questo articolo introduce come ottenere la differenza di orario in minuti in PHP. Include la funzione date_diff() e le formule matematiche.
In questa pagina
Per calcolare in minuti il tempo trascorso tra due valori data e ora in PHP, sottrai i rispettivi timestamp Unix e dividi i secondi per 60. Scegli questo approccio quando ti serve una durata. Usa date_diff() per un intervallo di calendario e strtotime() quando gli input sono stringhe analizzabili. Mantieni entrambi i valori nello stesso contesto di fuso orario e decidi se il risultato deve conservarne il segno o indicare il valore assoluto.
Calcolare i minuti trascorsi a partire dai timestamp
DateTimeImmutable rende espliciti i valori di input ed evita di modificarli durante il calcolo. Imposta un fuso orario per entrambi i valori; l’esempio usa UTC. Sottraendo i timestamp ottieni i secondi trascorsi con segno: un valore finale successivo produce un risultato positivo e il segno dipende dall’ordine della sottrazione. Racchiudi la differenza in abs() solo quando la direzione non è importante. La divisione per 60 mantiene i minuti frazionari; usa una funzione di arrotondamento solo se l’applicazione richiede minuti interi.
Esegui questo esempio. L’output mostra l’etichetta Elapsed minutes: in inglese, perché il blocco di codice è mantenuto invariato.
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-16 10:00:00', $timezone);
$elapsedMinutes = ($end->getTimestamp() - $start->getTimestamp()) / 60;
echo "Elapsed minutes: $elapsedMinutes\n";
Per calcolare il tempo effettivamente trascorso durante i cambi dell’ora legale, usa i timestamp ricavati da valori data e ora con il fuso orario previsto. In un fuso che osserva l’ora legale, non presumere che ogni giorno di calendario corrisponda esattamente a 1.440 minuti trascorsi.
Usare date_diff() per le differenze tra date di calendario
date_diff() (disponibile anche come $start->diff($end)) restituisce un DateInterval, non un unico conteggio dei minuti trascorsi. I componenti relativi a giorni, ore e minuti sono utili quando la domanda è formulata in termini di calendario, per esempio: «quanti giorni, ore e minuti separano le due date?». La proprietà invert dell’intervallo indica la direzione quando la data finale precede quella iniziale; l’argomento absolute può ignorare tale direzione. Nell’output dell’esempio, le etichette days, hours e minutes restano in inglese perché il blocco di codice è mantenuto invariato.
<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-18 12:30:00', $timezone);
$interval = date_diff($start, $end);
echo $interval->format('%R%a days, %h hours, and %i minutes');
Per un intervallo di calendario, puoi ricavare un conteggio nominale dei minuti dai suoi componenti con $interval->days * 1440 + $interval->h * 60 + $interval->i. Questo calcolo combina i giorni di calendario e le componenti dell’orologio; non sostituisce la sottrazione dei timestamp quando servono i minuti effettivamente trascorsi con precisione durante i cambi di fuso orario. Se la direzione è importante, conserva il segno dell’intervallo oppure applicalo al valore calcolato usando $interval->invert.
Analizzare stringhe di orario con strtotime()
strtotime() converte una stringa data e ora analizzabile in un timestamp Unix. Una stringa che contiene solo l’orario viene interpretata rispetto a un contesto di data: fornisci quindi date complete se i valori possono oltrepassare la mezzanotte o appartengono a date diverse. Imposta esplicitamente il fuso orario predefinito, oppure includi un fuso orario in ciascuna stringa, affinché entrambi i timestamp usino il contesto previsto. La sottrazione qui sotto mantiene il segno del risultato; usa abs() per ottenere una durata senza segno. L’output mostra l’etichetta Elapsed minutes: in inglese, perché il blocco di codice è mantenuto invariato.
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
<?php
date_default_timezone_set('UTC');
$start = strtotime('2024-06-16 23:30:00 UTC');
$end = strtotime('2024-06-17 00:15:00 UTC');
$minutes = ($end - $start) / 60;
echo "Elapsed minutes: $minutes\n";
Quando analizzi input non attendibili o variabili, verifica che ogni chiamata abbia restituito un timestamp prima di sottrarre i valori: l’analisi può non riuscire e restituire false. Per i dati dell’applicazione che richiedono una gestione chiara dei fusi orari, preferisci creare valori DateTimeImmutable con un fuso orario esplicito. Usa strtotime() per analizzare stringhe in modo conciso, la sottrazione dei timestamp per calcolare il tempo trascorso e date_diff() quando devi descrivere l’intervallo di calendario in sé.