2013-01-11 13 views

risposta

22

C'è una funzione format per questo. Ma non restituirà il numero di secondi. Per ottenere il numero di secondi si utilizza questa tecnica

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp()); 

Se davvero si vuole utilizzare $interval è necessario per calcolarlo.

$seconds = $interval->days*86400 + $interval->h*3600 
      + $interval->i*60 + $interval->s; 

Qui

  • 86400 è il numero di secondi in un giorno
  • 3600 è il numero di secondi in un'ora
  • 60 è il numero di secondi in un minuto
+0

restituisce '0 secondi' – sanchitkhanna26

+0

@MarkBaker si, ecco perché ho cambiato la risposta –

+0

Grande! Ho ottenuto questo lavoro. Grazie @shiplu – sanchitkhanna26

35

Un altro modo per ottenere il numero di secondi in un intervallo i s per aggiungerlo alla data zero e ottenere il timestamp di quella data:

$seconds = date_create('@0')->add($interval)->getTimestamp(); 

Questo metodo consente di gestire intervalli creati tramite il contructor DateInterval più o meno correttamente, mentre shiplu's answer ignorerà anni, mesi e giorni per tale intervalli. Tuttavia, la risposta di shiplu è più accurata per gli intervalli che sono stati creati sottraendo due date. Per intervalli che consistono solo di ore, minuti e secondi, entrambi i metodi otterranno la risposta corretta.

+0

@Brilliand Perché questa soluzione è meno accurata per gli intervalli creati sottraendo due date? Non capisco come. Puoi spiegare ? – MaxiWheat

+3

@MaxiWheat Dire che l'intervallo di tempo è stato creato sottraendo 2015-02-01 dal 2015-03-01. Questa è una differenza di un mese, che equivale a 28 giorni. Il metodo di Shiplu considererà questo come un intervallo di 28 giorni, mentre il mio metodo lo tratterà come un intervallo di un mese, selezionerà arbitrariamente gennaio come il mese e produrrà un timestamp basato sui 31 giorni di gennaio. – Brilliand

2

Vorrei aggiungere solo shiplu's answer:

function dateIntervalToSeconds($interval) 
{ 
    $seconds = $interval->days*86400 + $interval->h*3600 
     + $interval->i*60 + $interval->s; 
    return $interval->invert == 1 ? $seconds*(-1) : $seconds; 
} 

Per gestire intervalli negativi.

Si noti che - contrariamente a Brilliand's answer - Il codice sopra considererà correttamente anni, mesi e date. Perché $ interval-> days è un valore assoluto ($ interval-> d è relativo al mese).

EDIT: questa funzione è ancora correggere, come sottolinea @Brilliand. Un contro-esempio è

new DateInterval('P4M3DT2H'); 

Non gestisce bene i mesi.

+0

Un esempio di un intervallo su cui questo fallirà è 'new DateInterval ('P4M3DT2H')'. Provalo e vedi: la variabile 'days' è vuota, nonostante l'intervallo si estenda per circa 123 giorni. – Brilliand

+0

In futuro, se hai intenzione di accusarmi di essere sbagliato, ti chiedo di farlo in un commento sulla mia risposta. Mi ci è voluto molto tempo per accorgertene. – Brilliand

+0

@ Brilliand, hai ragione. Ho modificato la mia risposta di conseguenza. –