如何使用php mysqli将事件的实时插入数据库?

Aya*_*hah 5 php mysql datetime

我正在尝试为检查记录更改添加日期时间.我在表中使用datetime数据类型.

`date_added` datetime DEFAULT '0000-00-00 00:00:00',
Run Code Online (Sandbox Code Playgroud)

我在查询中使用以下php内置函数for datetime列

date("Y-m-d H:i:s");
Run Code Online (Sandbox Code Playgroud)

问题是date("Y-m-d H:i:s");当我在服务器上同时检查时,这个功能给了我两个不同的日期和时间.

Localhost结果

 date("Y-m-d H:i:s"); == 2016-07-12 13:10:04
Run Code Online (Sandbox Code Playgroud)

服务器结果

 date("Y-m-d H:i:s"); == 2016-07-12 05:08:07
Run Code Online (Sandbox Code Playgroud)

因此,当我在列上使用TimeAgo函数时, date_added它给了我错误的时间,我的意思是服务器时间.例如,我添加一个记录,然后函数将返回我,Record Added 8 Hours Ago所以它完全错误.我想知道如何将事件的实时添加到我可以使用TimeAgo()函数显示的数据库中.

有没有办法在不更改服务器时区的情况下做到这一点,因为如果我更改时区,那么它将只显示那些位于同一区域但会获得其他区域的人的正确时间?我认为他们将面临同样的问题.

我想开发类似Facebook DateTime功能的东西.

任何人都可以指导我如何实现这种功能?我想要感激.谢谢

Gor*_*don 10

为什么不做,而不是摆弄时区

ALTER TABLE `your_table`
  CHANGE `date_added` `date_added`
  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

这会将您的列从DATE列更改为TIMESTAMP列,将所有日期转换为流程中各自的UTC时间戳.

插入新行时,它将使用当前时间戳作为值.时间戳始终为UTC,因此您不必更改MySql服务器上的时区,也不必在插入新行时提供日期.

如果您不能或不想更改列,您也可以选择时间戳

SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Run Code Online (Sandbox Code Playgroud)

对于你的TimeAgo,你可以做到

$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Run Code Online (Sandbox Code Playgroud)

当您向DateTime提供时间戳时,无论您设置的是哪个默认服务器时区,它都将始终使用UTC.因此,您必须转换$dateAdded为默认时区(如上所示)或转换$timeSinceAdded为UTC.

要将dateTime更改为当前访问用户的时区,您要么

在任何情况下,您只需将两个DateTimes更改为该时区.这很容易通过setTimezone().

然后$timeSinceAdded将是一个DateInterval对象,您可以像这样使用它

echo $timeSinceAdded->format('%a total days');
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅链接,例如可用的格式修饰符.