PHP gmdate(“Y/m/d H:i:s”,time())返回错误的时间
我有一个用Kodula开发的Android应用程序,它将GPS坐标从智能手机发送到PHP脚本,PHP脚本将这些数据存储到MySQL表中。 日期是服务器日期。 有几款智能手机参与了这个小组,但其中两款手机的时间总是错的。 日期存储为gmdate(“Y/m/d H:i:s”,time()) 在MySQL表中日期显示错误的两款智能手机上,首先,正如格式所示,它应该是24小时格式,但它是12小时格式,时间比正确的时间晚1小时 例如,请检查下面的MySQL表: 顶部的记录显示了正确的GMT时间,因为在测试期间,两个装置都在报告GPS。 底部的记录以12h格式显示时间,错误时间比正确时间少1h 我尝试了在互联网上找到的几种格式建议,包括设置日期\默认值\时区\设置('GMT');在脚本顶部,但没有更改。测试同时在表中显示的两个单位上进行,相同的国家,相同的时区,只有GPS坐标不同 问题不可能来自智能手机,因为它没有设置日期,日期是由与正常工作的服务器相同的服务器生成的 PHP代码如下:PHP gmdate(“Y/m/d H:i:s”,time())返回错误的时间,php,mysql,Php,Mysql,我有一个用Kodula开发的Android应用程序,它将GPS坐标从智能手机发送到PHP脚本,PHP脚本将这些数据存储到MySQL表中。 日期是服务器日期。 有几款智能手机参与了这个小组,但其中两款手机的时间总是错的。 日期存储为gmdate(“Y/m/d H:i:s”,time()) 在MySQL表中日期显示错误的两款智能手机上,首先,正如格式所示,它应该是24小时格式,但它是12小时格式,时间比正确的时间晚1小时 例如,请检查下面的MySQL表: 顶部的记录显示了正确的GMT时间,因为在测
<?php
include('iotaccess.php');
date_default_timezone_set('GMT');
$devid = $latitude = $longitude = $altitude = $speed = $direction = $opstatus = $gpsstatus = $batstatus = "0";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$api_key_value = test_input($_POST["api_key"]);
if($api_key == $api_key_value) {
$devid = test_input($_POST["devid"]);
$latitude = test_input($_POST["latitude"]);
$longitude = test_input($_POST["longitude"]);
$altitude = test_input($_POST["altitude"]);
$speed = test_input($_POST["speed"]);
$direction = test_input($_POST["direction"]);
$opstatus = test_input($_POST["opstatus"]);
$gpsstatus = test_input($_POST["gpsstatus"]);
$batstatus = test_input($_POST["batstatus"]);
//if(test_input($_POST["gpsstatus"])==1){$gpsstatus=TRUE;}
//if(test_input($_POST["batstatus"])==1){$batstatus=TRUE;}
// Create connection
$conn = new mysqli($servername, $DBuser, $DBpass, $DBname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//$sql = "SELECT devid FROM GroupMembership WHERE devid='". $devid ."';";
$sql = "SELECT gm.devid,gt.command FROM GroupMembership as gm JOIN GroupTracker as gt on gm.devid=gt.devid WHERE gm.devid='". $devid ."';";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
if($row['devid']=='') {
echo "Devid not found.";
} else {
echo "command:".$row['command'];
if($gpsstatus==1){
$sql = "UPDATE GroupMembership set latitude=" .$latitude. ",longitude=" .$longitude. ",timestamp='" .gmdate("Y/m/d H:i:s", time()). "'";
$sql = $sql. " WHERE devid='" .$devid. "';";
if ($conn->query($sql) === TRUE) {
$sql = "UPDATE GroupTracker set altitude=" .$altitude. ",speed=" .$speed;
$sql = $sql. ",direction=" .$direction. ",timestamp='" .gmdate("Y/m/d H:i:s", time()). "'";
$sql = $sql. ",opstatus='" .$opstatus. "',gpsstatus=" .$gpsstatus. ",batstatus=" .$batstatus;
$sql = $sql. " WHERE devid='" .$devid. "';";
$conn->query($sql);
} else {
echo "Error: " . $conn->error;
}
}else{
$sql = "UPDATE GroupMembership set timestamp='" .gmdate("Y/m/d H:i:s", time()). "'";
$sql = $sql. " WHERE devid='" .$devid. "';";
if ($conn->query($sql) === TRUE) {
$sql = "UPDATE GroupTracker set timestamp='" .gmdate("Y/m/d H:i:s", time()). "'";
$sql = $sql. ",opstatus='" .$opstatus. "',gpsstatus=" .$gpsstatus. ",batstatus=" .$batstatus;
$sql = $sql. " WHERE devid='" .$devid. "';";
$conn->query($sql);
} else {
echo "Error: " . $conn->error;
}
}
}
$conn->close();
} else {
echo "Wrong API Key";
}
} else {
echo "No data posted with HTTP POST.";
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
不确定这是如何工作的
日期应该以yyyy-mm-dd
的格式传递给MySQL,因此当您传递带有斜杠格式的日期时,MySQL应该拒绝查询并给出一个错误
将计算日期更改为使用
timestamp='" .gmdate("Y-m-d H:i:s", time()). "'";
或者简单地使用NOW()
,让MySQL为您完成所有工作
timestamp=NOW()";
我认为您必须向我们展示创建日期时间并将其保存到数据库的PHP代码。为了消除错误的可能性,您可以始终将查询更改为使用NOW()
,而不是尝试用PHP生成日期。我假设该列是一个实时数据类型,而不是VARCHAR()?您好,刚刚检查过,该列是时间戳。在原始的post.Riggs中添加了代码,我可能搞砸了。列类型是timestamp而不是DATETIME,而且我已经将默认值设置为CURRENT_timestamp。也许我甚至不必保存这个专栏。我如何确保它将是格林尼治标准时间和24小时?谢谢,问题不在我发送的脚本中,这就是为什么更改没有解决问题。你上面的建议解决了问题。谢谢你,保罗