2012-12-20 7 views
7

Z powodu ujawnienia - Jestem okropny w javascript, ale próbuję się uczyć!Nowości w NvD3 - jak mogę uczynić moje znaczniki czasu unix jako daty na osi X?

Mam tablicę z kilku zapisów, takich jak te w nim:

[1349013600] => 232

Kluczem jest timestamp Unix, wartością jest $ w sprzedaży z tego dnia. Obecnie tworzę je na wykresie wielowarstwowym, który działa świetnie.

Problemem jest My X osi, który jest obecnie zdefiniowane następująco:

chart.xAxis 
.tickFormat(d3.format(',f')); 

że wysyła znacznik czasowy Unix'owych prostym Int z etykietami osi x i aktywowania podpowiedzi. Chcę spróbować uzyskać wynik jako D-M-Y lub podobny czytelny wskaźnik daty dla człowieka.

Najbliższy znalazłem jest ten kawałek kodu:

chart.xAxis.tickFormat(function(d) { 
     var dx = testdata[0].values[d] && testdata[0].values[d].x || 0; 
    return d3.time.format('%x')(new Date(dx)) 
}); 

Ale walczę, aby zrozumieć, co robi i nie może realizować w moim konkretnym wykresie. Obecny kod wygląda tak:

nv.addGraph(function() { 
var chart = nv.models.multiBarChart() 
      .stacked(true) 

chart.xAxis 
    .tickFormat(d3.format(',f')); 

chart.yAxis 
    .tickFormat(function(d) { return '$' + d3.format(',f')(d) }); 

d3.select('#chart1 svg') 
    .datum(test_data2) 
    .transition().duration(500).call(chart); 

nv.utils.windowResize(chart.update); 

return chart; 
}); 

Czy ktoś może wyjaśnić, jak to działa i - co ważniejsze - dlaczego? Doceń wszelkie wskazówki!

Odpowiedz

4

Znaczniki czasu JavaScript to im milisekundy, dlatego przed użyciem należy pomnożyć znacznik uniksowy przez 1000.

+1

Dzięki za cynk. Daty (przechowywane w SQL db) są już w czytelnym formacie (RRRR/MM/DD), ale konwertuję je za pomocą strtotime (funkcja PHP), kiedy wyciągam je z bazy danych. Wiem, że wydaje się to sprzeczne z intuicją, ale jestem przekonany, że faktyczne przypisanie wartości musi nastąpić w znaczku unixowym, aby odpowiednio rozmieścić je w osi. W każdym razie - powinno już być w s, a nie w ms. – mcl

14

I rozwiązać problem tak szybko, jak otwarto bounty (d'oh!)

Oto co pracował dla mnie

.tickFormat(function(d){return d3.time.format('%d-%b')(new Date(d));})

i sztuczki było sformatować dane dla nvd3 PO tym jest tworzona oś

+1

może, jeśli 5 osób uzna tę odpowiedź za pomocną i przegłosowaną Mogę złamać nawet punkty reputacji – CQM

+5

Zalecam zadeklarowanie formatu czasu poza funkcją tickFormat, aby nie tworzyć nowej instancji formatu czasu dla każdego zaznaczonego tiku do wyświetlenia (co będzie wolne i marnuje pamięć). Podobnie, zalecam konwersję danych na obiekty JavaScript Date jako etap przetwarzania wstępnego, a nie jako efekt uboczny formatowania tyknięć. W ten sposób, jeśli istnieją inne miejsca, w których odwołujesz się do daty, zawsze jest to właściwy obiekt Date, a nie UNIX-y lub gorzej, ciąg znaków. – mbostock