2010-06-24 9 views
5

Come posso ottenere un conto alla rovescia del tempo utilizzando PHP?Come visualizzare il conto alla rovescia del tempo utilizzando PHP e MySQL

Desidero visualizzare qualcosa come 3Days 4 ore. Ho un campo data proveniente dalla tabella MySQL e voglio calcolarlo con la data di oggi. A partire da ora ho solo la data e non il tempo memorizzato nel database, ma alla fine lo farò. Quindi in quel momento, potrei mostrare 3Days 4Hours 10Minutes 43seconds.

Questo è quello che ho provato, ma sono sempre un po 'di risposta sbagliata:

$datetime1 = new DateTime($starton);//$starton - date stored in db 
$datetime2 = new DateTime(date()); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%d days); 

Sono confuso se questo funziona sulla base del tempo server o la zona in cui l'utente proviene. Per favore guidami. Quando avrò il campo temporale, suppongo che potrei aver bisogno di jQuery per mostrare i secondi in diretta e quindi anche i minuti.

+0

La chiamata a 'date()' 'per $ datetime2' è superfluo e sbagliato, potrebbe essere questo il problema? Inoltre, che tipo di risposta sbagliata ottieni? – deceze

+0

Quando dici "mostra i secondi dal vivo" ... intendi che vuoi aggiornarlo in tempo reale? –

+0

hai ragione, quella potrebbe essere la ragione. Scusate, non sono in grado di ottenere anche l'output sbagliato, probabilmente ho modificato altre cose. Stavo leggendo la tua altra risposta ma sembra che tu l'abbia rimossa, qualsiasi motivo? – Jay

risposta

3

IMHO quando stai pensando di confrontare il tempo, inizi automaticamente a parlare del tempo Unix. Essenzialmente, il tempo Unix è un conteggio in secondi che aumenta sempre. Quando hai 2 timestamp Unix, puoi usare l'aritmetica semplice per calcolare la differenza e quindi tradurre la differenza in forma leggibile.

Si noti che i timestamp Unix sono comuni in quasi tutti i linguaggi di programmazione, quindi è possibile scegliere se farlo in PHP, MySQL o JavaScript e potrebbe essere tutto allo stesso modo. Ti mostrerò la versione di PHP.

Così si vuole fare questo:

  1. Trova il timestamp Unix per il vostro evento di destinazione
  2. Conservare che nel database MySQL
  3. recuperare dal database
  4. Get corrente timestamp Unix
  5. Sottrai per ottenere la differenza
  6. Moltiplica/dividi per ottenere il formato leggibile dall'uomo

Il codice PHP:

//Unix timestamp to Dec. 21, 2012 (midnight) 
$unix_time = mktime(0,0,0,12,21,2012); 
//Connect to MySQL 
//"INSERT INTO table (target_timestamp) VALUES ($unix_time);" 


//----- user goes to page ----- 
//Connect to MySQL 
$sql = "SELECT target_timestamp FROM table WHERE foo = bar"; 
$unix_time = do_query($sql);//do_query not defined, assume it gets the timestamp 
$current_time = time(); 
$diff = $unix_time - $current_time 
//$diff should be positive and not 0 
if(1 > $diff){ 
    exit('Target Event Already Passed (or is passing this very instant)'); 
} else { 
    $w = $diff/86400/7; 
    $d = $diff/86400 % 7; 
    $h = $diff/3600 % 24; 
    $m = $diff/60 % 60; 
    $s = $diff % 60; 

    return "{$w} weeks, {$d} days, {$h} hours, {$m} minutes and {$s} secs away!" 
} 
0

non al 100% rispondere alla tua domanda, ma un modo manuale per farlo sarebbe questo:

$start = strtotime($dbTime); 
$now = time(); 
$differenceInSeconds = $start - $now; 

Da lì è solo bisogno di formattarlo, e si può trovare un algoritmo in this answer.

0

Bene, penso che se si chiama date() sul server, si otterrà la data e il fuso orario del server. È possibile forzare il fuso orario con la funzione date_default_timezone_set([TIMEZONE]);, tuttavia, se questo è un problema.

Se stavo facendo questo, e volevo un conto alla rovescia secondo per secondo, probabilmente passare l'intervallo calcolato a javascript e lasciare che jQuery faccia la formattazione, in particolare se si vuole un contatore attivo.

Del resto, si potrebbe scaricare il tutto a javascript, e passare le due date, e utilizzare date1.getTime() - date2.getTime() per ottenere la differenza di tempo in millisecondi, e fare i calcoli da soli in javascript (questo è cribbed da this answer)

Probabilmente è come lo farei se lo stessi alterando in JS.

1

PHP utilizzerà il fuso orario impostato dal server, che può essere impostato manualmente nello script utilizzando date_default_timezone_set(). Puoi farlo in due modi:

Puoi effettivamente usare la tua query MySQL per fare il calcolo per te. Vedi la funzione TimeDiff(): http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff. Quindi, è possibile utilizzare TimeFormat() per formattarlo come desiderato.

In alternativa è possibile farlo tramite PHP. È possibile convertire in unix epoch -> formato come data. L'altra opzione sarebbe iniziare con due oggetti DateTime come hai fatto tu. Prova:

$datetime1 = new DateTime($starton); 
$datetime2 = new DateTime(); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%d days); 

o procedurale:

$datetime1 = date_create($starton); 
$datetime2 = date(); 
$interval = date_diff($datetime1,$datetime2); 
echo $interval->format('%d days'); 

Inoltre, se si desidera visualizzare il contatore come un aggiornamento in tempo reale del contatore; probabilmente dovrai consegnarlo in seguito a una funzione Javascript.

1

Dato che hai citato jQuery, è possibile farlo solo da JavaScript, se è ok con te.

plugin jQuery conto alla rovescia e l'esempio di lavoro: http://keith-wood.name/countdown.html

farà risparmiare effettuando chiamate al vostro db anche.

Problemi correlati