在 PHP 和 MySQL 中设置时区

2022-08-30 16:25:16

我正在制作一个应用程序,我需要使用PHP函数在MySQL中存储日期。date()

<?php $finalize_at = date('Y-m-d H:i:s'); ?>

这些日期需要在MySQL中使用函数进行比较,以返回小时数的差异,例如:NOW()

SELECT TIMESTAMPDIFF( hour, NOW(), finalize_at ) FROM plans;

但问题是 - PHP日期函数使用PHP时区设置,并且该函数从MySQL服务器获取MySQL时间。date('Y-m-d H:i:s')NOW()

我正在尝试解决这个问题:

  1. date_default_timezone_set('Europe/Paris');它仅适用于 PHP。
  2. date.timezone= "Europe/Paris";它仅适用于 PHP。
  3. SELECT CONVERT_TZ(now(), 'GMT', 'MET');此返回为空。
  4. mysql> SET time_zone = 'Europe/Paris';这会从MySQL的控制台引发错误。

MySQL的时区不会改变。

有没有办法更改PHP和MySQL的时区,而不必从MySQL控制台执行此操作,或者从中的某个地方设置时区更改并使这些值同时可用于PHP和MySQL。php.ini

非常感谢您的支持。


答案 1

在 PHP 中:

<?php
define('TIMEZONE', 'Europe/Paris');
date_default_timezone_set(TIMEZONE);

对于 MySQL:

<?php
$now = new DateTime();
$mins = $now->getOffset() / 60;
$sgn = ($mins < 0 ? -1 : 1);
$mins = abs($mins);
$hrs = floor($mins / 60);
$mins -= $hrs * 60;
$offset = sprintf('%+d:%02d', $hrs*$sgn, $mins);

//Your DB Connection - sample
$db = new PDO('mysql:host=localhost;dbname=test', 'dbuser', 'dbpassword');
$db->exec("SET time_zone='$offset';");

PHP 和 MySQL 时区现在已在应用程序中同步。无需去或MySQL控制台!php.ini

这是来自SitePoint上的这篇文章


答案 2

您只需通过以下两行PHP即可轻松完成。

$tz = (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P');
$pdo->exec("SET time_zone='$tz';");

推荐