我正在创建一个问答网站。但是我在处理日期/时间问题时遇到问题。 假设有两个用户 - USER1和USER2。 USER1在印度,而USER2在美国。现在,当USER1发布问题时,我将该问题存储在数据库中,时间戳为CURRENT TIMESTAMP。此问题现在将显示在公共仪表板页面中。现在,同时(比如2分钟后),在美国的USER2需要在他的时区看到问题。也就是说,他需要看到问题是在2分钟前发布的。我们如何在我的PHP代码中实现它。我使用Mysql服务器作为数据库。
当用户发布问题时,是否有必要将用户的时区存储在数据库中,以便需要计算其他用户的相对时间?如果是这样,我们如何在mysql数据库中存储时间戳和时区?
答案 0 :(得分:1)
虽然MySQL会在您当前的时区(或更具体地说是服务器的时区)中显示时间戳,但它们会存储在通用UTC时区中。
当用户在论坛上创建帐户时,他们应该选择所需的时区。 (您也可以从浏览器中自动检测它。)
然后,每次PHP脚本建立数据库连接后,您都将运行查询," SET time_zone =?" "?"将是您在个人资料中保存的时区。
之后,他们通过该连接进行的每个查询都会自动将UTC时间戳转换为他们的时区,您应该能够直接向用户显示结果。
答案 1 :(得分:0)
自行设置页面的默认时区,以便所有用户都可以使用您在此处设置的时区。 E.g
<?php date_default_timezone_set("Africa/Lagos"); ?>
答案 2 :(得分:0)
很简单。不要将时间戳直接存储到用户时区。
无论用户所在的时区如何转换为您的php默认时区并将其存储到数据库
如果来自印度的user1,将其转换为您的php时区保存邮件发布时间,同时显示给user2将时间戳从您的php时区转换为user2时区并显示数据。它会给出正确的值
确保您的php和MySQL时区相同。
For example
User 1 from IST
User 2 from UTC
Your php and MySQL time zone is PsT
If user1 post msg u convert IST to PST store to your db.
If user2 post msg u convert UTC to PST
store to it db.
While showing post to user1
U should convert PST to IST
for user2 Convert PST to UTC
USE MYSQL FUNCTION convert_tz
IN PHP to show ago follow below method
function time_elapsed_string($datetime, $full = false) {
$now = new DateTime;
$ago = new DateTime($datetime);
$diff = $now->diff($ago);
$diff->w = floor($diff->d / 7);
$diff->d -= $diff->w * 7;
$string = array(
'y' => 'year',
'm' => 'month',
'w' => 'week',
'd' => 'day',
'h' => 'hour',
'i' => 'minute',
's' => 'second',
);
foreach ($string as $k => &$v) {
if ($diff->$k) {
$v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
} else {
unset($string[$k]);
}
}
if (!$full) $string = array_slice($string, 0, 1);
return $string ? implode(', ', $string) . ' ago' : 'just now';
}
使用http://ipinfodb.com/ip_location_api.php
获取用户时区或通过Java脚本