我的服务器时间是格林尼治标准时间(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'><strong>Online</strong></font>"; } if ($lastSeen >= 300) { echo "<font size='1' color='black'><strong>Offline</strong></font>"; }
这里的技巧是知道什么是列类型date_last_active。我有足够的经验,TIMESTAMP并且DATETIME知道一个翻译(并尊重)MySQL time_zone会话变量,而另一个没有。
date_last_active
TIMESTAMP
DATETIME
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)
所以,这是我的工作:
my.cnf
time_zone=UTC
date_default_timezone_set('UTC')
UTC_TIMESTAMP()
NOW()
set time_zone='
'
希望这足以弄清楚如何解决此问题。如果您还有其他问题,请告诉我。