PHP和MySQL存在时区问题

我的服务器时间是格林尼治标准时间(GMT),每当有人在线时,我都会执行以下操作。

// 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'><span>Online</span></font>";

}

if ($lastSeen >= 300)

{

echo "<font size='1' color='black'><span>Offline</span></font>";

}

回答:

这里的技巧是知道什么是列类型date_last_active。我有足够的经验,TIMESTAMP并且DATETIME知道一个翻译(并尊重)MySQL

time_zone会话变量,而另一个没有。

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,一种是使用本地(会话)时区。如果您遵循上面的第一点,请使用UTC_TIMESTAMP()。
  • 选择显示给用户时,在显示任何内容之前先设置set time_zone='local_time_zone'
  • 如果必须显示内容,然后进行更新,请确保将您的呼叫括在PHP和MySQL中的相应时区更改中。

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

以上是 PHP和MySQL存在时区问题 的全部内容, 来源链接: utcz.com/qa/397769.html

回到顶部