我对Flotr2很新,我刚刚构建了一些简单的线图。这很简单,非常酷。但是,我需要将时间戳(月份日期加上一天的时间)作为我的x轴。我从我的数据库中获取时间,因此它在PHP代码中,我只是如此回应数据:
while($stmt11->fetch()){
echo " [" . $date_of_completion . ", " . $score . "]";
echo ",";
$i++;
$total_score += $score;
}
echo "];";
我已经让xaxis的模式成为“时间”并且我尝试了“约会”,它只是永远不会有效。它始终把所有东西都放在2001 - 2002年之间,这是完全错误的,所以我认为它只是不知道如何处理我给它的数据。还有其他人遇到过这个问题吗?我仔细查看了他们按时给出的例子,但对我来说没有任何意义。
任何帮助都会非常感激。感谢
EDIT 好的,还有一些代码。这正是我正在做的从PHP获取数据并将其转换为flotr2想要的格式。
if(!($stmt11 = $mysqliprivate->prepare("SELECT date_of_completion, score FROM ". $shs . " WHERE id = ? ORDER BY date_of_completion ASC"))){
echo "Prepare Failed: (" . $mysqliprivate->errno . ") " . $mysqliprivate->error;
}
else{
$total_score = 0;
$stmt11->bind_param("s", $id);
$stmt11->execute();
$stmt11->bind_result($date_of_completion, $score);
$time = time();
echo "var dataset = [";
$i = 0;
while($stmt11->fetch()){
$date = date("U", strtotime($date_of_completion));
echo " [" . $date . ", " . $score . "]";
echo ",";
$i++;
}
echo "];";
$stmt11->close();
}
这是我正在运行的JavaScript:
graph = Flotr.draw(container, [
{ data : dataset, label : 'Historical Patient Scores', lines:{show:true}, points: {show:true}}
], {
xaxis: {
minorTickFreq: 4,
title : 'Date of Completion',
tickDecimals: 0,
noTicks: 10,
mode : 'time',
timeformat : '%y/%m/%d'
},
yaxis : {
max : 30,
title : 'Score',
tickDecimals:0,
min: 0
},
grid: {
minorVerticalLines: true
},
legend : {
position : 'nw'
},
mouse: {
track: true,
relative:true,
trackDecimals:0,
sensibility: 5
}
});
})(document.getElementById("editor-render-0"));
答案 0 :(得分:3)
time
模式需要一个时间值,因此请将您的日期转换为纪元时间(以毫秒为单位)。请参阅http://php.net/manual/en/function.date.php了解如何将日期转换为大纪元时间,并记住php使用秒(不是像JavaScript和Flotr2那样的ms)。您还需要将x轴上的timeformat
设置为给定格式,例如:%m/%d/%y
在大纪元时间过后:
xaxis: {
mode: "time",
timeformat: "%m/%d/%y"
},
这会将时间转换回日期格式标签。
您可以使用以下内容:
%h: hours
%H: hours (left-padded with a zero)
%M: minutes (left-padded with a zero)
%S: seconds (left-padded with a zero)
%d: day of month (1-31), use %0d for zero-padding
%m: month (1-12), use %0m for zero-padding
%y: year (four digits)
%b: month name (customizable)
%p: am/pm, additionally switches %h/%H to 12 hour instead of 24
%P: AM/PM (uppercase version of %p)
答案 1 :(得分:2)
好的,所以@Chase和我一直试图让它工作一段时间,我想我明白了。 我把我自己的tickFormatter功能一起攻击了。实际上没有太多的文档,但一些简单的JavaScript知识就足够了。 所以为了得到纪元时间我就这样做了:
echo "var dataset = [";
$i = 0;
while($stmt11->fetch()){
$temp = strtotime($date_of_completion);
echo " [" . $temp . ", " . $score . "]";
echo ",";
}
echo "];";
$stmt11->close();
然后为了得到正确显示的时间,而不仅仅是疯狂的数字,这就是我一起入侵的地方:
xaxis: {
minorTickFreq: 4,
title : 'Date of Completion',
tickDecimals: 0,
noTicks: 20,
mode : 'time',
labelsAngle : 45,
tickFormatter: function(x){
var x = parseInt(x);
var myDate = new Date(x*1000);
var string = myDate.getFullYear();
string = string + "-" + myDate.getMonth() + "-" + myDate.getDate();
result = string;
return string;
}
},
然后如果你想让鼠标悬停产生相同的结果,把这段代码放在鼠标里面:
mouse: {
track: true,
relative:true,
trackDecimals:0,
sensibility: 5,
trackFormatter: function(o){
var t = parseInt(o.x);
var myDate = new Date(t*1000);
var string = myDate.getFullYear();
string = string + "-" + myDate.getMonth() + "-" + myDate.getDate();
return string + ", " + o.y;
}
}
所有其余的javascript和php都保持与我在顶部的原始问题相同。
答案 2 :(得分:1)
您的问题非常简单...为了使用内置格式化程序,您必须在Javascript中传入日期对象。像这样......
var dataArray = [[new Date('08/16/2012 03:40:15.000'),21.8917228040536],
[new Date('08/16/2012 03:40:15.000'),21.8917228040536]]
查看最终呈现的Javascript以获取线索 - PHP代码不会使此问题变得清晰。