2013-07-22 17 views
5

Ho un timestamp in un database MySQL in tempo GMT [2013-07-19 10:12:56]. So che dovrebbe essere nel DB come DateTime e UTC ma sfortunatamente questo è il modo in cui è.MySql TimeStamp e JavaScript Time

Ho bisogno di estrarre il timestamp e passare in JavaScript [HighCharts].

$time = strtotime('2013-07-19 10:12:56'); 
echo("Converting to UNIX Time: ");echo $time; 
echo("Converting to JS Time: ");echo ($time*1000); 

Come JavaScript richiede tempo in millisecondi da qui il moltiplicarsi acquistare 1000

uscita: Conversione in UNIX Tempo: 1374253976

uscita: Conversione in JS: Tempo: 1374253976000

La domanda che ho è perché compare in HighCharts come 17.12

Quando inserisco 1374253976000 in http://www.epochconverter.com ottengo:
GMT: ven, 19 lug 2013 17:12:56 GMT che non è corretto. L'ora dovrebbe apparire come visualizzata nel database come 10:12:56.

Qualche idea del motivo per cui sarebbe 7 ore?

+0

Hai provato a disabilitare il tempo UTC (http://api.highcharts.com/highstock#global.useUTC) –

+0

Sì, ma la sua ancora in 7h il futuro. var highchartsOptions = Highcharts.setOptions (Highcharts.theme, { globale: {useUTC: false}}); – DevilCode

+0

Il suo strano perché quando eseguo la nuova data (1374253976000) è anche dati corretti (come i vostri). –

risposta

10

Epochtimeconverter dice che Fri, 19 Jul 2013 10:12:56 GMT ha seguito gli orari d'epoca

Epoch timestamp: 1374228776 
Timestamp in milliseconds: 1374228776000 
Human time (GMT): Fri, 19 Jul 2013 10:12:56 GMT 
Human time (your time zone): Friday, July 19, 2013 3:42:56 PM 

Nota, è NON1374253976 come si stanno ottenendo. Quindi questo è il problema, la conversione da epochtime a highcharts, ecc. È corretta. È la tua epoca che sta diventando sbagliata

PHP considererà la stringa nel fuso orario del server, a meno che non venga indicato diversamente. dare una prova, specificare il fuso orario in modo esplicito come GMT come segue

$time = strtotime('2013-07-19 10:12:56' . ' GMT'); 
echo("Converting to UNIX Time: ");echo $time; 
echo("Converting to JS Time: ");echo ($time*1000); 

La differenza 7h che stavate osservando può essere perché il server si trova in un fuso orario del -7?

+0

Grazie per il vostro aiuto, il server era effettivamente in -7 fuso orario. – DevilCode

+0

@DevilCode siete i benvenuti :) –

2

Problema # 1

Il problema principale è nel vostro passo conversione utilizzando strtotime. PHP cerca di indovinare la relazione tra la stringa temporale e il fuso orario (probabilmente usando il fuso orario), ma nella tua situazione ha bisogno di sapere di più per indovinare correttamente. Puoi farlo indicando esplicitamente a PHP che la stringa temporale è rappresentata come GMT (Greenwich Mean Time).

Poiché il database ha solo il formato di AAAA-MM-GG HH: MM: SS, è possibile concatenare l'identificatore GMT necessario durante l'invocazione strtotime.

$time = strtotime('2013-07-19 10:12:56' . ' GMT'); 

Ad esempio:

<pre> 
<?php 
    $time = strtotime('2013-07-19 10:12:56' . ' GMT'); 
    echo("Converting to UNIX Time: $time\n"); 
    echo("Converting to JS Time: "); 
    echo ($time*1000); 
?> 
</pre> 

Conversione in UNIX Tempo: 1.374.228,776 mila
Conversione JS Tempo: 1374228776000

incollando il conseguente tempo di UNIX in risultati Epoch Converter correttamente in GMT: Fri, 19 Jul 2013 10:12:56 GMT

Problema # 2

Modifica del codice PHP come sopra è necessario, ma dal momento che non è completamente funzionante per voi, posso vedere che avete un problema più in corso. (Sebastian ha cercato di aiutarti con questo.)

Quello che vorrei aggiungere ai commenti di Sebastian è che le impostazioni globali devono essere configurate PRIMA di creare qualsiasi grafico o oggetto grafico nel tuo JavaScript. Altrimenti non avranno alcun effetto sull'output di quei grafici. Quindi è necessario assicurarsi che la seguente configurazione sia applicata prima dello qualsiasi oggetto grafico presente nel codice.

Highcharts.setOptions({ 
    global: { 
     useUTC: false 
    } 
}); 

(Se non si utilizza questa configurazione, i grafici saranno ancora funzionare bene, ma date e gli orari mostreranno rispetto al Greenwich Mean Time invece che il fuso orario locale per ogni utente che visualizza le classifiche.)

discussione (posizionato in seguito per coloro che odiano la discussione non devono leggerlo):

ho verificato che se siete a seguito del già modifica suggerita al vostro codice PHP, quindi ora avete la corretta UTC/L'ora numerica GMT passata a JavaScript. È possibile confermare questo 100% di sicuro con il seguente codice:

Date.UTC(2013, 6, 19, 10, 12, 56) 
1374228776000 
new Date(1374228776000).toUTCString() 
"Mon, 19 Aug 2013 10:12:56 GMT" 

Il secondo problema che si sta apparentemente di fronte è duplice: rendere Highcharts interpretano correttamente questo come un valore/GMT UTC piuttosto che un valore da qualche altra (come locale) fuso orario, E dicendo Highcharts per produrre correttamente il fuso orario nel formato desiderato.

Fare Highcharts correttamente interpretare i numeri di tempo: Con Highcharts predefinite assume i dati in tempo numerici come queste sono in UTC [[1.331.028 milioni, 5], [1.331.031,6 milioni, 6], [1.331.035,2 milioni, 4]]. A meno che non ci sia qualcosa di strano in agguato nel tuo JavaScript e che altera il modo in cui i dati temporali vengono elaborati, dovresti essere bravo a riguardo.

Highcharts Fare visualizzano l'ora esatta nelle date leggibili sulle carte: è qui che si dovrebbe svolgere molta attenzione alla API qui: http://api.highcharts.com/highcharts#global.useUTC

A proposito, Sebastian Bochan è membro di il team di supporto di Highcharts, quindi puoi fidarti dei suoi commenti.

+1

Scusa, non ho letto il resto della risposta di Jugal (fermato a circa la parola "Quindi questo è il problema" perché non avevo ancora visto alcuna soluzione) prima di fare clic su risposta. Avrei visto che ha suggerito la stessa identica cosa se avessi finito di leggere tutta la sua risposta. Oops! Lascio la mia risposta perché penso che sia una spiegazione più chiara (e l'ho testata invece di dire di provarla), ma Jugal ha il diritto di reclamare la taglia. –

+0

grazie per l'aiuto. – DevilCode

+0

@DevilCode siete i benvenuti! Facci sapere se hai ancora problemi e saremo lieti di aiutarti a risolverli. –

0

Si ha un problema di fuso orario.Al GMT il time-stamp 2013-07-19 10:12:56 si traduce in 1374228776 secondi dopo epoca: http://jsfiddle.net/hsvtE/

Lo script PHP tuttavia restituisce il errato tempo unix:

uscita: Conversione in UNIX Tempo: 1374253976

Come è possibile vedere la differenza tra i due timestamp:

1374253976 (incorrect) 
-1374228776 (correct) 
----------- 
     25200 seconds 

Il tempo di ritorno dello script PHP è 25200 secondi (o sette ore) prima dell'ora GMT. Il motivo per cui PHP restituisce il momento sbagliato dipende dal modo in cui funziona la funzione strtotime.

Se non è specificato il fuso orario nella data e ora, strtotime presuppone che il timestamp appartenga al fuso orario predefinito.

Ci sono due metodi per risolvere questo problema:

Metodo 1: Impostare il fuso orario predefinito per GMT

È possibile ottenere e impostare il fuso orario predefinito in PHP utilizzando le funzioni date_default_timezone_get e date_default_timezone_set. Utilizzando queste due funzioni si potrebbe impostare il fuso orario corretto per il timestamp come segue:

function get_time($timestamp, $timezone = 'GMT') { 
    $default_timezone = date_default_timezone_get(); // get current timezone 
    date_default_timezone_set($timezone);   // set correct timezone 
    $time = strtotime($timestamp);     // get correct time 
    date_default_timezone_set($default_timezone); // reset original timezone 
    return $time;         // return correct time 
} 

Ora si può tranquillamente ottenere il tempo corretto al GMT semplicemente chiamando get_time invece di strtotime:

$time = get_time('2013-07-19 10:12:56'); 

mi raccomando si utilizza questo metodo perché se il timestamp specifica già un fuso orario, quindi strtotime ignora semplicemente il fuso orario predefinito e utilizza invece il fuso orario specificato.

Metodo 2: specificare il fuso orario nel time-stamp stesso

Il secondo metodo è molto più breve:

function get_time($timestamp, $timezone = 'GMT') { 
    return strtotime($timestamp . ' ' . $timezone); 
} 

$time = get_time('2013-07-19 10:12:56'); 

Tuttavia mi sento di raccomandare di utilizzare il primo metodo, invece, perché è più sicuro. Ad esempio, se hai fornito il timestamp 2013-07-19 10:12:56 EST, la funzione precedente chiamerebbe strtotime con una stringa con due fusi orari - 2013-07-19 10:12:56 EST GMT.

Conclusione

Questo semplice cambiamento dovrebbe risolvere i vostri problemi. Se si desidera che il tempo in millisecondi poi semplicemente moltiplicare il tempo 1000:

$time = 1000 * get_time('2013-07-19 10:12:56'); 

sto supponendo che il codice lato client è corretto. Quindi se hai ancora problemi allora dovresti dare un'occhiata al tuo JavaScript.

0

In effetti non è un problema di JS. Il trucco risiede in PHP e in che modo "strtotime" esegue la conversione rispetto al fuso orario predefinito.

Nel tuo esempio, il timestamp viene calcolato come se fossi nel fuso orario "America/Los_Angeles", quindi ottieni 1374253976 secondi anziché 1374228776 con fuso orario "GMT". Dal momento che stai convertendo il timestamp relativamente al fuso orario GMT su epochconverter, viene visualizzata una "mancata corrispondenza".

I dati memorizzati in MySQL sono in GMT, il fuso orario dell'installazione PHP è "America/Los_Angeles". Quando "strtotime", interpreti i dati in MYSQL come non GMT ma America/Los_Angeles. Ecco perché ci sono 7 ore tra i due.

Ecco un piccolo script per spiegare meglio questo:

date_default_timezone_set('GMT'); 

echo strtotime('2013-07-19 10:12:56', time() - 10) . "\n"; 

date_default_timezone_set('America/Los_Angeles'); 

echo strtotime('2013-07-19 10:12:56', time() - 10) . "\n"; 

visualizzerà:

1374228776 // from epochconverter : Fri, 19 Jul 2013 10:12:56 GMT 
1374253976 // from epochconverter : Fri, 19 Jul 2013 17:12:56 GMT 

Notate come la sequenza "287" è sostituita dalla sequenza "539".

In PHP, quasi tutte le funzioni che manipolano il tempo lo faranno in base al fuso orario attualmente definito.

Guardate questo per maggiori informazioni:

PHP Default TimeZone