在尝试将MySql数据显示到CanvasJS图表时,我一直得到错误的日期。数据库的日期是2019年2月和3月,但我一直在1970年1月18日到19日。我首先将日期转换为时间戳,然后将其保存到dataPoints。我检查了在线时间戳转换器,当转换回日期时似乎时间戳是正确的。
这是来自控制器的代码:
public function generate(Request $request) {
if ($request->tip == 0) {
$uid = Auth::id();
$data= DB::select(DB::raw("SELECT 1 AS tip, prihodi.iznos, vrste_prihoda.naziv, prihodi.datum AS datum FROM prihodi LEFT JOIN vrste_prihoda ON vrste_prihoda.id = prihodi.vrsta_prihoda_id WHERE prihodi.datum >= '$request->od_datum' AND prihodi.datum <= '$request->do_datum' AND prihodi.user_id = '$uid' UNION SELECT 2 AS tip, izdaci.iznos, vrste_izdataka.naziv, izdaci.datum AS datum FROM izdaci LEFT JOIN vrste_izdataka ON vrste_izdataka.id = izdaci.vrsta_izdatka_id WHERE izdaci.datum >= '$request->od_datum' AND izdaci.datum <= '$request->do_datum' AND izdaci.user_id = '$uid' ORDER BY datum"));
$tip = 0;
} else if ($request->tip == 1) {
$data = DB::table('prihodi')->select('iznos', 'datum', 'naziv')->join('vrste_prihoda', 'vrste_prihoda.id', 'prihodi.vrsta_prihoda_id')->where('prihodi.user_id', Auth::id())->where('datum', '>=', $request->od_datum)->where('datum', '<=', $request->do_datum)->orderBy('datum')->get();
$tip = 1;
} else if ($request->tip == 2) {
$data = DB::table('izdaci')->select('iznos', 'datum', 'naziv')->join('vrste_izdataka', 'vrste_izdataka.id', 'izdaci.vrsta_izdatka_id')->where('izdaci.user_id', Auth::id())->where('datum', '>=', $request->od_datum)->where('datum', '<=', $request->do_datum)->orderBy('datum')->get();
$tip = 2;
}
$dataPoints = array();
$y = 0;
foreach($data as $item) {
if($tip == 0) {
if($item->tip == 2) {
$y = $y - $item->iznos;
} else {
$y = $y + $item->iznos;
}
} else if ($tip == 1) {
$y = $y + $item->iznos;
} else if ($tip == 2) {
$y = $y - $item->iznos;
}
$date = $item->datum;
$newDate = date("d-m-Y", strtotime($date . '-1 Month'));
list($day, $month, $year) = explode('-', $newDate);
$x = mktime(0, 0, 0, $month, $day, $year);
array_push($dataPoints,array("x" => $x, "y" => $y));
}
return view('generate')->with('dataPoints', $dataPoints);
}
在视图中我有以下脚本:
<script type="text/javascript">
window.onload = function () {
var chart = new CanvasJS.Chart("chartContainer",
{
title: {
text: "Primanja/izdaci za odabrani period"
},
axisY: {
valueFormatString: "#,###"
},
axisX:{
title: "time",
gridThickness: 2,
interval:2,
intervalType: "day",
valueFormatString: "hh TT K",
labelAngle: -20
},
data: [
{
type: "area",
color: "rgba(0,75,141,0.7)",
xValueType: "dateTime",
dataPoints: <?php echo json_encode($dataPoints, JSON_NUMERIC_CHECK); ?>
}
]
});
chart.render();
}
</script>
JavaScript时间戳以毫秒为单位,而PHP时间戳以秒为单位。结果,你获得了非常不同的日期,减去1000倍。将PHP时间戳乘以1000,然后将其传递给图表应该可以正常工作。
$date = $item->datum;
$newDate = date("d-m-Y", (strtotime($date . '-1 Month') * 1000));
list($day, $month, $year) = explode('-', $newDate);
$x = mktime(0, 0, 0, $month, $day, $year);
array_push($dataPoints,array("x" => $x, "y" => $y));