![](/img/trans.png)
[英]java SimpleDateFormat - Correct format for Postgres “timestamp with timezone” date format
[英]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.