PHP ve MySQL ile yaşıyorsunuz Dilimi sorunlar

2 Cevap php

Benim sunucu GMT saati olduğunu ve birinin online geldiğinde ben aşağıdakileri yapın.

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

Yani, benim sorunum bu ... Birisi bir şey yaptığında bana sorunların bir bütün tuhafı neden ... kullanıcıları yerel saati tarih / saati saklar.

Ben istediğim GMT saklanır her şey için, ama kullanıcıların görmek ve var kendi yerel saat diliminde veri ile etkileşim.

EDIT:

İşte kullanıcıları durumunu güncelleyerek am nasıl:

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

İşte saniye içine bir tarih damgası açmak için benim işlevi ...

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

Ve nihayet, nasıl tarihleri ​​karşılaştırarak kulüpler:

	$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>";
	}

2 Cevap

Burada püf noktası ne sütun türü date_last_active olduğunu bilmektir. Ben bir MySQL time_zone oturum değişkeni, diğer değil çevirir (ve onur) olduğunu bilmek TIMESTAMP ve DATETIME ile yeterli deneyim yaşadım.

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)

Yani, burada ne olduğunu:

  • Veritabanına eklerken, PHP ve MySQL UTC kullanın. In my.cnf var: time_zone=UTC MySQL herhangi bir sorunları önlemek için, ve PHP I date_default_timezone_set('UTC').
  • UTC_TIMESTAMP() yerine NOW() kullanın - Tek UTC, biri yerel (oturum) saat dilimini kullanır. Eğer ilk noktayı takip ediyorsanız, yukarıdaki UTC_TIMESTAMP () kullanın.
  • Kullanıcıya göstermek için seçerken, hiçbir şey göstermeden önce set time_zone=' * local_time_zone * '.
  • Eğer şeyler görüntülemek için varsa, o zaman, güncelleme PHP ve MySQL uygun zaman dilimi değişiklikleri ile aramalarınızı dirsek emin olun.

Umarım bu yaklaşım nasıl anlamaya yeter. Eğer başka sorularınız varsa bana bildirin.

Ben Mysql NOW () fonksiyonu, sunucu zaman döner I) Ayrıca ben (PHP'nin zaman inanıyorum, bu sorunu çözebileceğini, CONVERT_TZ (dt, from_tz, to_tz) kontrol ediyorum, kesinlikle bir güçlük geçerli saat dilimini, depolar düşünüyorum yerine bu depolayabilir. Tek dezavantajı bir datetime / timestamp uyumlu değer döndürülen değeri dönüştürmek gerekiyor, ya da bir varchar olarak saklamak değildir. convert_tz kullanarak dezavantajı bazı çirkin sorgu ile bitebileceğini ve geçerli zaman dilimini bunu kullanılan her zaman anlamaya olurdu olduğunu.