2013-02-14 19 views
21

im usando php 5.4.6 e MySQL 5.5.29 e ottengo problemi convertendo UNIX TIMESTAMP in MYSQL DATETIME e viceversa. Mysql e php wun sulla stessa macchina locale.PHP-MYSQL: conversione di Unix Timestamp in DateTime e viceversa

Ho una semplice tabella MySQL

CREATE TABLE Entry(
id SERIAL PRIMARY KEY, 
created DATETIME NOT NULL); 

Per inserire i dati che uso php mysql DOP e NOW(). Funziona bene, il datetime corretto è memorizzato nel database.

Il mio piano è di lavorare con timestamp unix sul lato client (php & mysql sul lato server).

Quindi mi piacerebbe consegnare timestamp unix al mio cliente. Pertanto utilizzo la funzione MySql UNIX_TIMESTAMP() per convertirla direttamente nella query.

Quindi una query di esempio si presenta così:

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry 

Il risultato: create = 2013-02-14 20:47:35 TS = 1360871255

Così ora voglio fare il in un altro modo, ho passato un Timestamp UNIX e voglio confrontarlo con le voci nel mio database. Sfortunatamente non sono in grado di scrivere uno script PHP che funzioni. Non so perché, ma quando mi sto passando la stessa data e ora (1.360.871,255 mila) per PHP non ottengo 2013/02/14 20:47:35 con questo metodo:

public static function toDateTime($unixTimestamp){ 
    return date("Y-m-d H:m:s", $unixTimestamp); 
} 

Quando chiamo toDateTime (1360871255) restituirà 2013-02-14 20:02:35 che non è il DateTime originale.

Lo so, non ho bisogno di formattare 1360871255 su un Y-m-d H: m: s per usarlo in MySQL, ma 1360871255 sembra non essere il tempo che mi aspettavo (e MYSQL UNIX_TIMESTAMP è tornato).

Quello che voglio fare è una semplice query che mi mostra le voci che sono più vecchi di una certa data e ora, qualcosa di semplice come questo:

SELECT * FROM Entry WHERE created < 1360871255 

ma come ho detto prima, il risultato della query non è il previsto , perché 1360871255 sembra non essere l'ora esatta.

Non si specifica alcun fuso orario speciale per la connessione mysql in php.

Qualche suggerimento?

risposta

36

Il tuo date format è errato ... i è per minuto, non m (mesi).

return date("Y-m-d H:i:s", $unixTimestamp); 

Alcune note collaterali:

  • non c'è bisogno di ri-assegnazione, vale a dire $unixTimestamp = $unixTimestamp;
  • Dal momento che si sta utilizzando PHP> 5.3. potresti essere interessato al nuovo oggetto DateTime.
+1

Dannazione, il tuo diritto ... omg ... sono così stupido – sockeqwe

+3

@sockeqwe - Non sei stupido. L'hai appena superato. Succede. – Greeso

3

il problema risiede nella funzione che hai scritto:

return date("Y-m-d H:m:s", $unixTimestamp); 

Si specifica mese (m) in entrambe le porzioni di data e ora. È necessario sostituire il secondo m con i, il flag corretto per ore quando si utilizza la data() in PHP.

return date("Y-m-d H:i:s", $unixTimestamp); 

A seconda delle esigenze, è possibile trovare la funzione PHP strtotime() abbastanza utile.

0
function format_date($str) { 
    $month = array(" ", "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"); 
    $y = explode(' ', $str); 
    $x = explode('-', $y[0]); 
    $date = "";  
    $m = (int)$x[1]; 
    $m = $month[$m]; 
    $st = array(1, 21, 31); 
    $nd = array(2, 22); 
    $rd = array(3, 23); 
    if(in_array($x[2], $st)) { 
      $date = $x[2].'st'; 
    } 
    else if(in_array($x[2], $nd)) { 
      $date .= $x[2].'nd'; 
    } 
    else if(in_array($x[2], $rd)) { 
      $date .= $x[2].'rd'; 
    } 
    else { 
      $date .= $x[2].'th'; 
    } 
    $date .= ' ' . $m . ', ' . $x[0]; 

    return $date; 
} 
0

niente di entrambi. dovresti salvare il timestamp come INT o BIGINT perché se utilizzi il formato TIMESTAMP di mysql non lo ridicherai mai più a un int. È possibile ottenere qualcosa come questo 1970-01-01 01:00:00.

1

Perché non utilizzare semplicemente la funzione FROM_UNIXTIME in mysql?

+0

Il linguaggio SQL fa schifo e anche le estensioni MySQL, specialmente quelle recenti. Ed è molto più facile e piacevole lavorare con un linguaggio di programmazione reale rispetto a un linguaggio meta che non si adatta al resto dell'applicazione. – Deji

Problemi correlati