簡體   English   中英

如何使用帶有來自Postgres的時區的unix時間戳來格式化D3軸

[英]How to format D3 axis using a unix timestamp with timezone from postgres

我正在嘗試在D3折線圖上設置x軸的格式,但是值完全錯誤。 數據來自Postgres數據庫的“帶時區的時間戳”列,我將其轉換為json,以通過D3提供服務​​。

D3片段

data.forEach(function(d) {
    d.timestamp = new Date(d.timestamp*1000);
    d.close=+d.close;
}
var timeFormat = d3.time.format("%d %b %y %X");
var x = d3.time.scale().range([ 0, width ]);
var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(timeFormat);
x.domain(d3.extent(data, function(d) {
        return d.timestamp;
    }));

Java轉換為JSON

ResultSet rs = st.executeQuery("select * from price_data order by timestamp);
...     
String.format("{\"timestamp\":\"%d\",\"close\":\"%f\"}",rs.getTimestamp("timestamp").getTime(),rs.getDouble("price"));

值為1426014732000的時間戳的軸格式化結果 錯誤的軸顯示格式解釋

我不明白的是,當逐步瀏覽我的JavaScript並通過Chrome中的watch表達式調用它時,timeFormat函數可以正常工作... 在此處輸入圖片說明

為什么會發生這種情況,我仍然不知道,但解決方法是更改​​數據轉換,以使時間戳不乘以1000(在線上到處都建議)。

data.forEach(function(d) {
  //d.timestamp = new Date(d.timestamp*1000);
  d.close=+d.close;
}
var timeFormat = d3.time.format("%d %b %y %X");
var x = d3.time.scale().range([ 0, width ]);
var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(timeFormat);
x.domain(d3.extent(data, function(d) {
        return d.timestamp;
    }));

現在,正確繪制了時間戳。 也許PostgreSql時間戳已經使用了Javascript中所期望的毫秒數。 我將進行調查並向將來提出報告的人反饋。

看來您在做大多數事情都是對的,但是如果沒有完整的代碼,這實際上是不可能的。 您如何計算scale domain 就像是:

x.domain(d3.extent(data));

無論如何,我整理了這個簡單的示例 ,可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM