你好,我有一个投票系统。
一旦一个人投票,我就有一个名为“nextVote”的专栏。
该列将保留用户可以再次投票的日期。 通过该专栏,我将能够回应他在投票前需要等待多少小时/分钟。
这是我的尝试:
public final function setNextVote($ip)
{
$this->insert = $this->pdo->prepare("UPDATE auths SET nextVote = NOW() + INTERVAL 12 HOUR WHERE voter_ip = :ip");
$this->insert->execute(array(":ip" => $ip));
}
它存储的内容:
2013-05-14 05:56:24
为什么?..
我要做的是:当前时间+12小时。
如果今天是2013年,05年,14年和12月。
在12小时内会是
2013,05,14,24:00 为什么不这样做?
public function getTimeLeft($ip)
{
$this->get = $this->pdo->prepare
("
SELECT TIMESTAMPDIFF(MINUTE, `nextVote`, NOW())
FROM auths
WHERE `voter_ip` = :ip
");
$echo = $this->get->execute(array(":ip" => $ip));
return $echo;
}
答案 0 :(得分:1)
问题是您希望在本地时区得到一个结果。默认情况下,MySQL在调用NOW()
或任何其他时间/日期相关函数时使用系统时区生成时间戳。
您可以按照here所述将--timezone
参数传递给MySQL来更改服务器上的时区。
但是,时区与您的申请无关,因为您只对相对时间感兴趣。您的应用程序的用户可能处于任何时区,因此没有必要假设一个特定的时区。
答案 1 :(得分:1)
您的数据库看起来正在使用GMT,您可以更改数据库上的时区,但如果其他东西正在使用它,那么在生产计算机上这可能很难。它应该解决这个问题。或者,试试这个
$date = date( 'Y-m-d H:i:s', strtotime( 'now +12 hours' ) );
$sql = "UPDATE auths SET nextVote = '{$date}' WHERE voter_ip = :ip";
如果您想更新时区(并且在ubuntu上),请运行dkpg-reconfigure tzdata
答案 2 :(得分:0)
如果您希望下一个日期在当天的边界...而不是从现在到分钟的 12小时 - 您可以在日期数据周围包裹DATE()
结果,它会将其修剪为日期时间字段的日期。
UPDATE auths SET nextVote = DATE(DATE_ADD(NOW(), INTERVAL 1 DAY)) WHERE voter_ip = :ip