gpt4 book ai didi

php - PHP 和 MySQL 的时区问题

转载 作者:行者123 更新时间:2023-11-29 01:12:38 26 4
gpt4 key购买 nike

我的服务器时间是格林威治标准时间,只要有人上线,我就会执行以下操作。

// Set a default timezone
$defaultTimeZone = 'America/Toronto';

// load the user, if they are online...
$onlineUser = new user();
if (isset($_SESSION['user_id']))
{
if ($onlineUser->loadUser($_SESSION['user_id']))
{
$defaultTimeZone = $onlineUser->timeZone;
}
}

// set time zones
date_default_timezone_set($defaultTimeZone);
$db->query("SET SESSION time_zone = '".$defaultTimeZone."'");

所以,我的问题是......每当有人做某事时,它都会将日期/时间存储在用户本地时间......给我带来了一大堆问题。

我想要的是所有内容都以 GMT 存储,但让用户在他们的本地时区查看数据并与之交互。

编辑:

这是我更新用户状态的方式:

public function updateStatus()
{
global $db, $common, $config;

// update the user record
$data = array(
'date_last_active' => new Zend_Db_Expr('NOW()')
);

$db->update('users', $data, 'user_id='.$this->userId);
}

这是我将日期戳转换为秒的函数...

public function dateTimeToUnixTime($dateString)
{
if (strlen($dateString) < 10)
{
return "";
}

$parseDateTime = split(" ", $dateString);
$parseDate = split("-", $parseDateTime[0]);

if (isset($parseDateTime[1]))
{
$parseTime = split(":", $parseDateTime[1]);
}
else
{
$parseTime = split(":", "00:00:00");
}

return mktime($parseTime[0], $parseTime[1], $parseTime[2], $parseDate[1], $parseDate[2], $parseDate[0]);
}

最后,我是如何比较日期的:

    $date = $oUser->dateLastActive;

$lastSeen = abs($common->dateTimeToUnixTime(date('Y-m-d H:i:s')) - $common->dateTimeToUnixTime($date));

if ($lastSeen < 300 )
{
echo "<font size='1' color='green'><strong>Online</strong></font>";
}

if ($lastSeen >= 300)
{
echo "<font size='1' color='black'><strong>Offline</strong></font>";
}

最佳答案

这里的诀窍是知道date_last_active 是什么列类型。我对 TIMESTAMPDATETIME 有足够的经验,知道其中一个翻译(并尊重)MySQL time_zone session 变量,另一个则不。

mysql> SET SESSION time_zone = 'America/New_York';
Query OK, 0 rows affected (0.00 sec)

mysql> create table timetest ( dt datetime NULL, ts timestamp NOT NULL DEFAULT 0 );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO timetest ( dt, ts ) VALUES ( UTC_TIMESTAMP(), UTC_TIMESTAMP() );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO timetest ( dt, ts ) VALUES ( NOW(), NOW() );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM timetest;
+---------------------+---------------------+
| dt | ts |
+---------------------+---------------------+
| 2009-06-27 17:53:51 | 2009-06-27 17:53:51 |
| 2009-06-27 13:53:54 | 2009-06-27 13:53:54 |
+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql> set session time_zone='UTC';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM timetest;
+---------------------+---------------------+
| dt | ts |
+---------------------+---------------------+
| 2009-06-27 17:53:51 | 2009-06-27 21:53:51 |
| 2009-06-27 13:53:54 | 2009-06-27 17:53:54 |
+---------------------+---------------------+
2 rows in set (0.00 sec)

所以,这就是我所做的:

  • 插入数据库时​​,在 PHP 和 MySQL 中使用 UTC。在 my.cnf 中我有:time_zone=UTC 以避免在 MySQL 中出现任何问题,在 PHP 中我有 date_default_timezone_set('UTC')
  • 使用 UTC_TIMESTAMP() 而不是 NOW() - 一种是 UTC,一种使用本地( session )时区。如果您遵循上述第一点,请使用 UTC_TIMESTAMP()。
  • 选择向用户显示时,在显示任何内容之前设置 time_zone='local_time_zone'
  • 如果您必须先显示内容,然后再更新,请确保在调用时对 PHP 和 MySQL 进行适当的时区更改。

希望这足以弄清楚如何处理这个问题。如果您还有其他问题,请告诉我。

关于php - PHP 和 MySQL 的时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com