我试图为检查记录更改添加日期时间。我在表中使用了datetime数据类型。
`date_added` datetime DEFAULT '0000-00-00 00:00:00',
我在查询
中使用以下php内置函数for datetime列date("Y-m-d H:i:s");
问题是当我在服务器上同时检查时,这个函数date("Y-m-d H:i:s");
给了我两个不同的日期和时间。
date("Y-m-d H:i:s"); == 2016-07-12 13:10:04
date("Y-m-d H:i:s"); == 2016-07-12 05:08:07
因此,当我在date_added
列上使用TimeAgo函数时,它给了我错误的时间,我的意思是服务器时间。例如,我添加一个记录,然后函数将返回我Record Added 8 Hours Ago
所以它完全错误。我想知道如何将事件的实时添加到我可以使用TimeAgo()
函数显示的数据库中。
有没有办法在不更改服务器时区的情况下做到这一点,因为如果我更改时区,那么它将只显示那些位于同一地区但会获得其他人的时间的正确时间?我认为他们将面临同样的问题。
我想开发类似Facebook DateTime功能的东西。
任何人都可以指导我如何实现这种功能?我想要感激。谢谢
答案 0 :(得分:10)
而不是摆弄时区,为什么不做呢
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
This will change your column from a DATE column to a TIMESTAMP column,将所有日期转换为流程中各自的UTC时间戳。
插入新行时it will use the current timestamp as a value。时间戳始终为UTC,因此您不必更改MySql服务器上的时区,也不必在插入新行时提供日期。
如果您不能或不想更改列,您也可以通过
选择时间戳SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
对于你的TimeAgo,你可以做到
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
当您向DateTime提供时间戳时,无论您设置的默认服务器时区如何,它都将始终使用UTC。因此,您必须将$dateAdded
转换为默认时区(如上所示)或将$timeSinceAdded
转换为UTC。
要将dateTime更改为当前访问用户的时区,您可以
在任何情况下,您只需将两个DateTime更改为该时区。 This is easily done via setTimezone()
.
$timeSinceAdded
将成为DateInterval
个对象,which you can use like this
echo $timeSinceAdded->format('%a total days');
请参阅链接以获取更多详细信息,例如可用的格式修饰符。
答案 1 :(得分:1)
如果您从具有不同时区设置的客户端访问同一数据库服务器,您还可以插入并检查sql中的日期/时间字段:
INSERT INTO my_table SET date_added = NOW();
然后还要查看
SELECT * FROM my_table WHERE TIMESTAMPDIFF(SECOND, date_added, NOW()) > 3600;
选择超过1小时的行。
答案 2 :(得分:1)
你的问题有点含糊不清,但我会尝试解释一下我认为应该解决这个问题的解决方法。 如果您允许其他用户添加或更新您的数据库,那么您应该获得有关它们的一些信息,例如它们来自哪个城市/大陆。您可能还有电话联系人以及有关他们的更多信息。 如果您拥有有关数据库中用户的此类信息,则在登录系统时使用该信息检测并加载其时区。 您可以拥有一个包含所有时区的表,或创建一个包含所有已知时区的数组,以便在您调用时
date_default_timezone_set('大陆/城市&#39)
功能您可以动态更改参数以适应当前用户的时区,然后使用它来影响添加日期的字段。
答案 3 :(得分:0)
TimeAgo/nicetime函数使用strtotime()
将您的datetime
字段值转换为unix timestamp。从1970年1月1日00:00:00 UTC开始,您将收到一个秒数,直到您作为字符串传递的日期为止。然后time()
函数返回直到现在的秒数,nicetime
比较差异。问题发生在strtotime
,当我们向它发送文字时,如#34; 2016-07-12 05:08:07",它不知道它在哪个时区以及它应该如何转换为UTC,因此它使用最佳猜测,通常不正确。
指定您传递到nicetime()
功能的日期的时区。而不是这样做:
$date = '2016-07-04 17:45'; // get from database
print nicedate($date);
试试这个:
$date = '2016-07-04 17:45';
print nicedate($date . ' America/Denver');
// mind the gap --------^
那应该解决它。
答案 4 :(得分:-1)
在盲目前进并开始比较时间或对从数据库检索的值执行日期/时间计算之前,我们必须了解各个数据库的配置设置以确保我们的计算正确。
应该注意MySQL时区变量的默认设置是MySQL启动时的SYSTEM。 SYSTEM值是从操作系统的GLOBAL time_zone环境变量中获得的。
通过提供以下命令行选项,可以在启动时将MySQL的默认时区变量初始化为不同的值:
--default-time-zone=timezone
或者,如果要在选项文件中提供值,则应使用以下语法设置变量:
--default-time-zone='timezone'
如果您是MySQL SUPER用户,可以在运行时从MYSQL>设置SYSTEM time_zone变量。使用以下语法提示:
SET GLOBAL time_zone=timezone;
MySQL还支持单个SESSION时区值,默认为GLOBAL time_zone环境变量值。要在SESSION期间更改会话时区值,请使用以下语法:
SET time_zone=timezone;
为了询问现有的MYSQL时区设置值,您可以执行以下SQL来获取这些值:
SELECT @@global.time_zone, @@session.time_zone;
还应该注意:
当前会话时区设置会影响区域敏感的时间值的显示和存储。这包括由NOW()或CURTIME()等函数显示的值,以及存储在TIMESTAMP列中和从TIMESTAMP列中检索的值。 TIMESTAMP列的值将从当前时区转换为UTC以进行存储,并从UTC转换为当前客户端时区以进行检索。
要获取UTC时间的值,请改用UTC_DATE(),UTC_TIME()或UTC_TIMESTAMP()函数。要转换为另一个时区,请将相应UTC函数的值返回convert_tz(),这需要生成zoneinfo表(参见下文)。
在您的情况下,如果您不想/不能更改SERVER time_zone 值,则必须为每个客户端显式设置单独的SESSION timezone 值连接,这将使您能够在沙子中绘制一条线,并具有一个已知的基础,您可以从中转换并将Facebook用户的发布时间显示到查看者的本地时区。
要在连接时显式设置会话时区,请发出以下命令:
SET SESSION time_zone = '+10:00';
当您显式设置SESSION time_zone并存储TIMESTAMP值时,服务器会将其从客户端的time_zone转换为UTC并存储UTC值(服务器内部存储TIMESTAMP值)。从数据库中选择数据时,会发生相反的转换,并在客户端的时区为客户端提供UTC时间。
关于数据类型和时区的主题,在PHP中,如果您希望通过促进夏令时感知日期和时间来提高日期和时间值的准确性,最好使用DatTimeZone class。< / p>
如前所述,如果您的数据库是MySQL,您可以使用以下命令加载/生成zoneinfo表:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
* where root is the username to be substituted.
执行zoneinfo表的生成允许您使用convert_tz()函数,该函数可以准确地将日期和时间从一个时区转换为另一个时区,如下所示:
select DATE_FORMAT(convert_tz(now(), 'UTC', 'Australia/Perth'), '%e/%c/%Y %H:%i') AS PERTH_TIME;
PERTH_TIME;
+-----------------+
| PERTH_TIME |
+-----------------+
| 19/7/2016 19:42 |
+-----------------+
此外,您可以通过调用PHP DateTimeZone类中的静态函数listIdentifiers()以编程方式生成UTC时区数组。
愿力量与你同在。