2009-07-30 15 views
22

Moim celem jest przekonwertowanie znacznika czasu z MySQL na obiekt Date JavaScript w efektywny sposób. Tu jest mój bieżący fragment, który przetwarza datownika MySQL w sformatowanej daty w PHP:JavaScript Data Indeks miesiąca obiektu zaczyna się od 0

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

jestem następnie za pomocą tego $date wartości dla wykresu przy użyciu wykresów API Google'a, który wymaga JavaScript obiekt Date:

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

Problem polega na tym, że obiekt Date JavaScript zaczyna indeks miesiąca od 0, więc dane wyjściowe zawsze wynoszą 1 miesiąc z wyprzedzeniem. Jaki jest najskuteczniejszy sposób radzenia sobie z tym problemem?

Z góry dziękuję!

+0

tytuł tego wpisu sugeruje, że jesteś zszokowany tym, że indeks byłby równy zeru. lol sensacyjny – Kristian

+0

Masz rację. Ten post był 3 lata temu. Teraz, kiedy na to patrzę, to zabawne, że zaskoczył mnie indeks zaczynający się od 0 =) –

+30

Myślę, że twoja niespodzianka była w tym przypadku uzasadniona: wartość miesiąca zindeksowana jest całkowicie nieintuicyjna. Twórcy JavaScripta nie byli w stanie zindeksować wartości dnia ani wartości roku (nie było roku 0, więc rok zindeksowany byłby wyłączony o jeden). Dlaczego ta logika nie przeniesiona do kolumny miesiąca jest niezrozumiała. –

Odpowiedz

17

Można karmić datę konstruktor datę w dd/mm/rrrr lub yyyy/mm Format/dd i będzie go konwertować:

>>> 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

Możesz również użyć formatu RRRR/MM/DD –

+0

Słodki! Zadziałało. Dzięki. –

+1

Dzięki za tego człowieka. Jestem wściekły od wielu dni zastanawiając się, dlaczego mój datepicker dzwoni w lipcu sierpnia. Okazuje się, że ktoś poszedł na pełnych obrotach i postanowił się lenić przy pomocy swojej arytmetyki wskaźnika. Dla odniesienia od momentu zadawania pytania, powodem, dla którego tablice w większości języków zaczynają się od zera, jest arytmetyka wskaźnika. Podczas próby znalezienia lokalizacji pamięci ciągów o stałej szerokości, należy zasadniczo wziąć wskaźnik bazowy i dodać indeks pomnożony przez długość komórki/łańcucha, aby uzyskać wskaźnik do wymaganej wartości. 0 * index + wskaźnik bazowy = lokalizacja dla pierwszego przedmiotu. – Shayne

13

Musisz ręcznie odjąć tę dodatkową 1 od numeru miesiąca, obawiam się. Obiekt JS Date to bałagan.

+0

Tego właśnie się obawiałem. Byłem zszokowany, że to odkryłem! –

+6

Byłeś zszokowany, gdy dowiedziałeś się, że JS to bałagan brzydkich rzeczy? : D – Svend

+0

To nie zadziała w niektórych przypadkach. –

1

Aby uzyskać datę w Date String Representation compatible with the Google Charts DataTable jak

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

bez chodząc wierszy kwerendy w PHP, można mieć go sformatować MySQL bezpośrednio tak:

<?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); 

następnie w javascript:

var data = google.visualization.arrayToDataTable(<?php echo($json) ?>); 
Powiązane problemy