Вопрос по php, mysql, timezone – Проблемы с часовым поясом с PHP и MySQL

2

Время моего сервера в GMT, и я делаю следующее, когда кто-то выходит в сеть.

<code>// 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."'");
</code>

Итак, моя проблема заключается в следующем ... всякий раз, когда кто-то что-то делает, он сохраняет дату / время по местному времени пользователя ... вызывая у меня целый ряд проблем.

Все, что я хочу, это чтобы все было сохранено в GMT, но пользователи могли видеть & amp; взаимодействовать с данными в местном часовом поясе.

EDIT:

Вот как я обновляю статус пользователей:

<code>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);
}
</code>

Вот моя функция, чтобы превратить штамп даты в секунды ...

<code>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]);
}
</code>

И наконец, как я сравниваю даты:

<code>    $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>";
    }
</code>
Почему бы и нетkeep все в GMT и в БД, и конвертировать его в соответствующий часовой пояс только тогда, когда вы хотите отобразить его? mpen

Ваш Ответ

3   ответа
0

что функция Mysql NOW () хранит текущий часовой пояс, что определенно хлопотно, я бы проверил CONVERT_TZ (dt, from_tz, to_tz), это могло бы решить вашу проблему, также я считаю, что php time () возвращает серверное время, вы можете хранить это вместо этого. Единственным недостатком является то, что вам нужно либо преобразовать возвращаемое значение в значение, совместимое с датой / временем, либо сохранить его как varchar. Недостаток использования convert_tz заключается в том, что вы можете столкнуться с некоторыми ужасными запросами, и вам придется выяснять текущий часовой пояс каждый раз, когда вы его используете.

9

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)

Итак, вот что я делаю:

When inserting into the database, use UTC in PHP and in MySQL. In my.cnf I have: time_zone=UTC to avoid any issues in MySQL, and in PHP I date_default_timezone_set('UTC'). Use UTC_TIMESTAMP() instead of NOW() - one is UTC, one uses the local (session) time zone. If you're following the first point, above, use UTC_TIMESTAMP(). When selecting to display to the user, set time_zone='local_time_zone' before displaying anything. If you have to display stuff, then update, make sure to bracket your calls with the appropriate timezone changes in PHP and MySQL.

Надеюсь, этого достаточно, чтобы понять, как к этому подойти. Дайте мне знать, если у вас есть дополнительные вопросы.

Спасибо за разъяснения и примеры :) MichaelICE
0

чтобы решить эту проблему, и я думаю, что мне нужно помогать другим. Поэтому я даю вам некоторые рекомендации, чтобы избежать проблем с часовым поясом.

First of all you have two options either use MYSQL TIMEZONE or PHP TIMEZONE don't mix it with each other if you want stay away from timezone nightmares.

ЕСЛИ ВЫ ВЫБИРАЕТЕMYSQL TIMEZONE:

ДЛЯ ВСТАВКИ:

fieldname: yourfieldname

datatype: timestamp 

default: CURRENT_TIMESTAMP

ДЛЯ ОБНОВЛЕНИЯ:

UPDATE YOUR_TABLE SET youfieldname = NOW() WHERE CONDITION;

ДЛЯ ВЫБОРА:

Единственное, что вам нужно сделать, это установить требуемый часовой пояс для вашего приложения. MySQL автоматически преобразует сохраненную временную метку в указанный часовой пояс.

mysql>SET SESSION time_zone='offset'; 
mysql>SELECT NOW();

пример смещения:+05:30 для Индии таким же образом найдите смещение для вашего региона.

Теперь вы получите желаемую дату и время из MySQL.

ЕСЛИ ВЫ ВЫБИРАЕТЕPHP TIMEZONE:

Просто установите желаемый часовой пояс с помощью этой функции:

date_default_timezone_set('America/Los_Angeles');

ДЛЯ ВСТАВКИ:

fieldname: yourfieldname

datatype: Дата и время

Используйте функцию даты PHP, чтобы сохранить дату и время:

$sql = "INSERT INTO timetest ( YOURDATETIMEFIELD ) VALUES ('".date('Y-m-d H:i:s')."')";

ДЛЯ ОБНОВЛЕНИЯ:

$sql = "UPDATE YOUR_TABLE SET yourdatetimefield = '".date('Y-m-d H:i:s')."'";

ДЛЯ ВЫБОРА:

$sql = "SELECT yourdatetimefield FROM yourtable";

Я надеюсь, что это поможет вам.

Похожие вопросы