【问题标题】:Current time + 12 hours当前时间 + 12 小时
【发布时间】:2013-05-07 16:10:09
【问题描述】:

您好,我有一个投票系统。

一旦有人投票,我就有一个名为“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:00。

12小时后

2013 年 5 月 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;
    }

【问题讨论】:

  • 你的意思是 12 小时后会是 2013-05-15 00:00:00?
  • 它使用 UNIX 时间,即 GMT。目前是 GMT 时区的 06:02 PM。再加上 12 小时,它变成了上午 06:02,这就是您的结果所表明的。
  • 没有 24:00 这样的事情,应该是 2013-05-15 00:00:00
  • 在sql-manager中运行SELECT NOW() + INTERVAL 12 HOUR
  • 更好的是,运行SELECT NOW()

标签: php


【解决方案1】:

问题是您希望得到本地时区的结果。 MySQL 在调用 NOW() 或任何其他时间/日期相关函数时默认使用系统时区来生成时间戳。

您可以通过将--timezone 参数传递给MySQL 来更改服务器上的时区,如here 所述。

但是,时区与您的应用程序无关,因为您只对相对时间感兴趣。您的应用程序的用户可能位于任何时区,因此没有必要假设一个特定的时区。

【讨论】:

  • 不正确。 stackoverflow.com/questions/1445702/…NOW() 遵循系统的时区
  • @Ascherer 你是对的!我刚刚改变了我的答案,对不起:)
  • 您仍然说它默认使用 GMT,但事实并非如此。它默认使用系统时区。此外,假设 OP 拥有来自多个时区的用户,这是一个糟糕的假设
  • @Ascherer 我认为这是一个非常合理的假设,因为公共应用程序比时区为常数的特定内部解决方案更常见。
【解决方案2】:

您的数据库看起来使用的是 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

【讨论】:

  • 我可以使用 NOW() 以外的东西吗?
  • 你可以使用php的日期函数
  • 谢谢,伙计。知道我现在如何返回分钟吗?例如 (CURRENT DATE - nextVote) 然后获取分钟/小时:您可以在 5 小时 03 分钟内再次投票?
  • ^ 查看我更新的帖子以查看我的方法,但它总是返回“1”。
  • 再次大声笑,id在那里使用php,个人喜好,但看看stackoverflow.com/questions/5906686/…
【解决方案3】:

如果您希望下一个日期在当天的边界内...而不是 12 小时从现在到现在 - 您可以将 DATE() 包裹在您的日期数学结果周围,这会将其修剪为日期时间字段的日期。

UPDATE auths SET nextVote = DATE(DATE_ADD(NOW(), INTERVAL 1 DAY)) WHERE voter_ip = :ip

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 2021-03-10
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2018-02-19
    相关资源
    最近更新 更多