在PHP中将服务器时间转换为DateTime类

时间:2015-12-05 18:34:26

标签: php mysql datetime

我将时间Datetime存储在Mysql中。我想向用户显示自发布以来已经过了多长时间。

$serverdate = $row['serverdate']; //get datetime from server
$serverdate_as_datetime = date_create_from_format('Y-m-d H:i:s', $serverdate); //i fucked up here
$now = new DateTime(); // what time is it
$since = $now->diff($serverdate_as_datetime); //difference

echo $since->m.'<br>'.$since->d.'<br>'.$since->h.'<br>'.$since->i.'<br>'.$since->s;

这是疯狂的事情。起初看起来代码工作完美但在那之后我意识到两次之间的差异正在减少有时增加!!! 即使我没有触摸代码!! 我放弃了如果你建议新事我愿意尝试。谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

两次是不同的,因为$serverdate$now不会同时生成

答案 1 :(得分:0)

我无法在本地复制问题。但是,应该增加的时间量,因为'then'和'now'之间的时间量随着时间的推移而增加。

我用字符串替换$row['serverdate'],因为我没有你的数据库。

以下是可以进行的事情:

  1. 您获得$row['serverdate']的查询实际上并没有返回您期望的内容。
  2. 如果涉及多个服务器,则可能是服务器时钟未完全同步。例如,如果在SQL中使用NOW()创建数据库值,则该值将基于DB服务器时钟,而比较时间基于Web服务器的时钟。 (这就是为什么Facebook和其他网站使用“2秒前”用于非常近期的事情,即使它实际上不是2秒之前。保持大量服务器完美同步而没有延迟是不现实的。)
  3. php和数据库之间可能存在时区设置差异。如果你说时间量有时会减少,这很可能是因为差异实际上是负数并且增加了,但是你的代码并没有表明差异会是负数,所以你看到的是绝对值,它们正在减少。要解决此问题,请将第三个参数添加到具有数据库服务器时区的date_create_from_formatSee Manual
  4. 我曾经尝试复制的代码在这里(几乎与OP相同)。

    <meta http-equiv="refresh" content="0.5">
    
    <?php
    
    $serverdate = "2015-02-24 05:26:42"; //get datetime from server
    $serverdate = date_create_from_format('Y-m-d H:i:s', $serverdate); 
    $now = new DateTime(); // what time is it
    $since = $now->diff($serverdate); //difference
    
    echo "m " . $since->m . "<br/>d " . $since->d . " <br />h " . $since->h . "<br />i " . $since->i . "<br />s " . $since->s;