MySQL与PHP的时区发行



背景:我有一些PHP代码,该代码在下次应根据各种规则发送重复消息时计算。我还有一个理智页面,可以仔细检查下一次复发是正确的。由于我不确定如何解决的时区问题,理智页面显示出一些我不确定它们是否确实是问题的问题。

我相信这些是因为(未来的)日期是在BST(英国夏季)期间,但欧洲/伦敦时区目前正在GMT上。

我创建了一个非常简化的测试页面,以调试并测试一个示例。代码如下:

// 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和MySQL时区相同,PHP日期也有所不同。如上所述,我认为这是因为给定的日期是在BST和欧洲/伦敦目前GMT。

如果我将1495620000放入http://www.epochconverter.com/,它告诉我它是星期三,2017年5月24日10:00:00 GMT

我目前不确定有两件事

  1. 当前数据库条目正确吗?到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' ...的查询更新

我弄清楚了(我认为)。

因为MySQL当前在GMT,所以我需要向GMT中的MySQL介绍Y-M-D H:I:S格式化的日期和时间,即使日期是BST。

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

如果有人看到我正在做的事情,请让我知道!

相关内容

  • 没有找到相关文章

最新更新