2016-11-30 4 views
0

背景:次回のメッセージをさまざまなルールに従って送信する次の時間を計算するPHPコードがあります。私はまた、次の再発が正しいことを二重チェックする健全性ページを持っています。解決方法がわからないタイムゾーンの問題のため、実際に問題があるかどうかわからない問題がいくつか示されています。MySQLとPHPのタイムゾーンの問題

(将来の)日付はBST(British Summertime)期間中ですが、ヨーロッパ/ロンドンのタイムゾーンは現在GMTであるため、これらは表示されていると思います。

私は非常に単純化されたテストページを作成して、その1つの例をデバッグしてテストしました。コードは以下の通りである:

// Not included: DB connection setup, which includes a query to set the MySQL session timezone to the current timezone for Europe/London as calculated by PHP 

// Copied from a comment at http://php.net/manual/en/function.date-default-timezone-get.php 
function timezone_offset_string($offset) 
{ 
    return sprintf("%s%02d:%02d", ($offset >= 0) ? '+' : '-', abs($offset/3600), abs($offset % 3600)); 
} 

$offset = timezone_offset_get(new DateTimeZone(date_default_timezone_get()), new DateTime()); 

// query_multiple() is a function to get a single result from the database and return it as the specified PDO type 
$db = query_multiple("SELECT NextRecurrence, UNIX_TIMESTAMP(NextRecurrence) AS NextTS, IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) AS DBTZ FROM RecurringMessages WHERE RecurID=96 LIMIT 1", "", "", PDO::FETCH_ASSOC); 

print "DB Date of NextRecurrence : ".$db['NextRecurrence']."<br>"; 
print "DB timestamp of NextRecurrence : ".$db['NextTS']."<br>"; 
print "DB timezone : ".$db['DBTZ']."<br>"; 

print "PHP timezone and offset: " .date_default_timezone_get().", ".timezone_offset_string($offset) . "<br>"; 
print "PHP date of NextTS : ".date('Y-m-d H:i:s', $db['NextTS'])."<br>"; 

次のように、このページの出力は次のとおりです。

DB Date of NextRecurrence : 2017-05-24 10:00:00 
DB timestamp of NextRecurrence : 1495620000 
DB timezone : +00:00 
PHP timezone and offset: Europe/London, +00:00 
PHP date of NextTS : 2017-05-24 11:00:00 

あなたが見ることができるように、PHPの日付はPHPとMySQLのタイムゾーンがあるにもかかわらず、一時間異なっています同じ。上記のように、私は、与えられた日付がBSTの間であり、ヨーロッパ/ロンドンが現在GMTであるためだと思います。

私はhttp://www.epochconverter.com/に1495620000を入れた場合、それは水、24であることを私に伝えます2017年5月午前10時00分○○秒GMT

私は現在

  1. ですが不明だが2つあります現在のデータベースエントリは正しいですか? 2017年5月24日になると、このメッセージは10:00または11:00に送信されますか?メッセージの送信に使用されるPHPコードは、接続した直後のMySQLのセッションタイムゾーンを、ヨーロッパ/ロンドンの現在のタイムゾーンと一致するように設定します。
  2. データベースの項目が正しい場合は、PHP日付機能を使用して今後の日付の正しい出力を得るにはどうすればよいですか? PHPの日付関数が正しい場合、どのように(一般的に)MySQLレコードを正しい日付で更新するのですか?私が知っているのは、それが2017年5月24日10:00に送られるべきだということだけです。現在、クエリの更新はUPDATE SET NextRecurrence='2017-05-24 10:00:00' ...

答えて

0

となっています(私は思う)。

MySQLは現在GMTになっているので、日付がBSTの間であっても、Y-m-d H:i:s形式の日付と時刻をGMTでMySQLに提示する必要があります。

// $ts contains the correct unix timestamp 

$offsetnow=date('Z'); 
$tsoffset=date('Z', $ts); 
$diff=$offsetnow-$tsoffset; 

// Add the difference to the timestamp so that the PHP date returns the appropriately presented Y-m-d H:i:s to MySQL, which as of writing this is GMT. 
$ts+=$diff; 

$query="UPDATE Recurrences SET NextRecurrence='".date('Y-m-d H:i:s', $ts)."' ... 

私がやっていることに間違いがある場合は、教えてください。