2009-07-30 11 views
22

Il mio obiettivo è convertire un timestamp da MySQL in un oggetto Date JavaScript in modo efficiente. Ecco il mio frammento di corrente che converte il timestamp di MySQL in una data formattata in PHP:JavaScript Data L'indice del mese dell'oggetto inizia con 0

<?php 
// formats timestamp into following format: 2009, 7, 30 
$date = date("Y, n, j", strtotime($row["date"])); 
?> 

Sto quindi utilizzando questo valore $date per un grafico utilizzando API di creazione di grafici di Google, che ha bisogno di JavaScript Data oggetto:

data.setValue(<?=$count;?>, 0, new Date(<?=$date;?>)); 

Il problema è che l'oggetto Data JavaScript inizia l'indice del mese con 0, quindi l'output è sempre 1 mese in anticipo. Qual è il modo più efficace per affrontare questo problema?

Grazie in anticipo!

+0

il titolo di questo post implica che sei scioccato dal fatto che un indice sarebbe uguale a zero. lol sensational – Kristian

+0

Hai ragione. Questo post è stato 3 anni fa. Ora che mi guardo indietro, è un po 'strano che mi sia sorpreso un indice partito da 0 =) –

+30

Penso che la tua sorpresa fosse giustificata in questo caso: un valore del mese a zero-indici è completamente non intuitivo. I creatori di Javascript avevano la presenza della mente di non azzerare il valore del giorno, o il valore dell'anno per quella materia (non c'era l'anno 0, quindi un anno a zero indicizzato sarebbe fuori da uno). Perché questa logica non è stata riportata nella colonna del mese è incomprensibile. –

risposta

17

È possibile alimentare il costruttore Data una data/mm/aaaa o aaaa/mm formato gg/dd e sarà convertirlo:

>>> new Date('7/30/2009'); 
Thu Jul 30 2009 00:00:00 GMT-0700 (Pacific Daylight Time) 
>>> new Date('2009/7/30'); 
Thu Jul 30 2009 00:00:00 GMT-0700 (Pacific Daylight Time) 
+2

È anche possibile utilizzare il formato AAAA/MM/GG –

+0

Dolce! Ha funzionato. Grazie. –

+1

Grazie per questo uomo. Sono stato infuriato per giorni a chiedermi perché il mio posticipato stia chiamando luglio agosto. Si scopre che qualcuno è andato a tutto tondo e ha deciso di diventare pigro con il loro aritmetico puntatore implementando questo. Per riferimento, poiché è stato chiesto in giro, il motivo per cui gli array nella maggior parte delle lingue iniziano da zero è dovuto all'aritmetica del puntatore. Quando cerchi di trovare la posizione di memoria di una serie di stringhe a larghezza fissa, in pratica prendi il puntatore di base e aggiungi l'indice moltiplicato per la lunghezza della cella/stringa per ottenere il puntatore al valore richiesto. 0 * indice + puntatore di base = posizione per il primo elemento. – Shayne

13

Devi sottrarre manualmente quello extra 1 dal mese numero che ho paura. L'oggetto Data JS è un disastro.

+0

Questo è esattamente ciò di cui avevo paura. Sono rimasto scioccato di aver scoperto questo! –

+6

Sei rimasto scioccato nello scoprire che JS è un mucchio di cose brutte? : D – Svend

+0

Questo non funzionerà per alcuni casi –

1

Per ottenere una data nel Date String Representation compatible with the Google Charts DataTable come

"Date(2015,0,31)" // note the quotes from the json string and the 0 for January 

senza camminare attraverso le righe di query in php, si potrebbe avere formato MySQL direttamente in questo modo:

<?php 
$sql = " 
    SELECT 
     CONCAT('Date(', YEAR(datefield), ',', (MONTH(datefield)-1), ',', DAY(datefield), ')') AS gChartDate, 
     valuefield 
    FROM 
     table 
    ORDER BY 
     datefield 
"; 
$query = $pdo->query($sql); 
$fetchAll = $query->fetchAll(PDO::FETCH_NUM); // fetch in not-associative array 
array_unshift($fetchAll, [['type'=>'date', 'label'=>'date'], 'value']); // add title row 
$json = json_encode($fetchAll, JSON_NUMERIC_CHECK); 

poi in javascript:

var data = google.visualization.arrayToDataTable(<?php echo($json) ?>); 
Problemi correlati