在MySQL PHP中使用SET time_zone的任何缺点

时间:2017-05-28 19:05:04

标签: php mysql datetime timezone

我在我的数据库中使用时间戳字段,我的PHP软件有自己的基于用户时区的时间管理系统。我想对某些类型的数据使用时间戳字段(在何时创建或修改),并且还能够使用te DEFAULT CURRENT_TIMESTAMP作为列。

每次创建会话时,使用SET time_zone = '+00:00'将时区设置为UTC是否有任何不足之处。我有四个独立的数据库,软件使用,目前,我将当前时区设置为UTC。

我不想使用DATETIME,因为它们的尺寸更大,而且我也无法使用DEFAULT CURRENT_TIMESTAMP,因为服务器的时区可能有偏移量。

2 个答案:

答案 0 :(得分:0)

如果您的后端已经使用所有逻辑正确转换用户的时区,则不应使用SET time_zone,因为您不必要地浪费资源。 UTC时区应该是数据库的元数据,数据库事务总是可以使用它们。

顺便说一下TIMESTAMP columns always will be stored in UTC,所以你不需要设置它,除非你的列是datetime(我认为不是这样)。

  

当您插入TIMESTAMP值时,MySQL会将其转换为您的   连接的时区为UTC以进行存储。当您查询TIMESTAMP时   值,MySQL将UTC值转换回连接的时间   区。请注意,其他时间不会发生此转换   数据类型,如DATETIME。

所以你有两个选择:

  • 在sql中设置事务中的时区与时间一致;
  • 将unix时区用于后端,仅在前端向用户显示正确的转换时间。

我更喜欢第二个。

答案 1 :(得分:0)

在处理输入日期和/或修改日期的日期/时间时,最好使用长度约为200的普通VARCHAR(或任何其他适合完整日期的值)以便存储完整的日期和处理PHP脚本中的日期/时间。这使您可以根据PHP代码中定义的时区灵活地查看时间。 Click here在PHP中查看可用的时区。

您也可以使用PHP的date_format以任何可能的格式格式化日期/时间。

我在下面给出了参考代码。

//This is the way you define your timezone in PHP code
date_default_timezone_set('Asia/Beirut');

//You can capture the date/time by using the below code. This will store "2017-05-28 23:55:34"
$date_time_registered = date('Y-m-d H:i:s');

//Retrieve the date/time and re-format it as you require. Below code will output "May", full month.
$retrieve_month_only = date_create($row['your_store_date_time']);
$retrieve_month_formatted = date_format($retrieve_month_only, 'F');

echo $retrieve_month_formatted;

您可以参考this link了解PHP日期/时间格式。