我留给我的任务的唯一一件事是显示自用户上次访问他的统计信息仪表板以来的新交易量,我认为我理解这个概念相当不错,但似乎我遇到了一个问题。
这个问题是用户拥有的当前日期和SQL使用的当前时间戳不是同一个。 (我认为这会因时区而异吗?)
我想我正在寻找的是时间=区域MySQL存储DATETIME(当前时间戳)字段,因此我可以获取用户的当前时间戳,他的时区,并尝试执行逻辑使它们一样。
或者有更简单的方法吗?我目前在仪表板中使用DATETIME格式显示购买日期的信息,其格式与表格中的 2015-01-12 01:02:18 类似。
也许我的查询错了,谁知道:
function getNewTransactions($connection, $user) {
$statement = $connection->prepare("SELECT `lastcheck` FROM `login` WHERE 1");
$statement->execute();
while($row = $statement->fetch()) {
$d = $row['lastcheck'];
}
$statement = $connection->prepare("SELECT * FROM `transactions` WHERE `date` > :d");
$statement->bindParam(":d", $d);
$statement->execute();
$transactions = 0;
while($row = $statement->fetch()) {
$transactions++;
}
$date = date("Y-m-d H:i:s");
$statement = $connection->prepare("UPDATE `login` SET `lastcheck` = '{$date}' WHERE `username`=:name");
$statement->bindParam(":name", $user);
$statement->execute();
return $transactions;
}
如果我换掉>周围到<它确实显示了较旧的交易,但它们已经过了几个小时。
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以使用
从MySql获取时区 SELECT @@system_time_zone;
或使用
从GMT获得+/-偏移量 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
在您的情况下,您可以尝试这样的事情
SELECT convert_tz(`lastcheck`, 'TIMEZONE_LASTCHECK_IS_STORED_IN', @@system_time_zone, ) as lastcheck
FROM `login`
WHERE 1
但理想情况下,数据库中的所有日期时间都应存储在同一时区。这将消除您当前的问题。你可以用......来实现这个目标。
SELECT @@system_time_zone
... and save the value into the PHP variable $db_timezone_code
... then replace the $date assignment with ...
$db_timezone = new DateTimeZone($db_timezone_code);
$now = new DateTime('now');
$now->setTimeZone($db_timezone);
$date = $now->format('Y-m-d H:i:s');
... $date is now converted from the PHP servers timezone
... to the databases default timezone.