Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql UNIX_TIMESTAMP()存储为UTC,夏时制即将来临_Php_Mysql_Utc_Unix Timestamp_Dst - Fatal编程技术网

Php MySql UNIX_TIMESTAMP()存储为UTC,夏时制即将来临

Php MySql UNIX_TIMESTAMP()存储为UTC,夏时制即将来临,php,mysql,utc,unix-timestamp,dst,Php,Mysql,Utc,Unix Timestamp,Dst,My DB server(运行MySql 5.5)设置为UTC,并使用UNSIGNED INT将日期存储为数据库中的Unix时间戳。数据库主要用于存储在特定时间(exec_time)运行的任务 我通过使用登录用户的时区(本例中为BST)在PHP中创建时间戳来插入任务。例如,我有一个任务设置为在1351396800运行,这是明天早上格林尼治标准时间凌晨4点 我使用以下查询从数据库中提取任务: SELECT * FROM tasks WHERE exec_time <= UNIX_TIMEST

My DB server(运行MySql 5.5)设置为UTC,并使用UNSIGNED INT将日期存储为数据库中的Unix时间戳。数据库主要用于存储在特定时间(exec_time)运行的任务

我通过使用登录用户的时区(本例中为BST)在PHP中创建时间戳来插入任务。例如,我有一个任务设置为在1351396800运行,这是明天早上格林尼治标准时间凌晨4点

我使用以下查询从数据库中提取任务:

SELECT * FROM tasks WHERE exec_time <= UNIX_TIMESTAMP();

在回答您的问题时,这取决于时间字段的重要性,以及服务器的本地时间是否会更改。如果是UTC,那么它可能不会改变

MySQL中的时态类型不支持时区。您必须自己实现时区,可能需要始终存储一个UTC时间戳/日期时间和一个单独的时区列,其中包含一个从+12到-12小时的间隔偏移量,表示要向时区的UTC时间戳添加或减去多少时间

不幸的是,在时区字段中输入什么值的实际处理以及检索为时区调整的时间戳所需的工作取决于您


如果切换到Postgres是一个选项,那么您可以始终使用Postgres提供的时区类型的时间戳

tl;dr只要您的
exec\u time
列具有时间戳数据类型,您就可以了

没有显式的UNIX\u时间戳列数据类型。存在时间戳列数据类型。当从日期/时间字符串转换为UTC时,此数据类型列的值将自动从客户端连接的时区转换为UTC(a/k/a Z或祖鲁时间,f/k/a格林威治标准时间),并在转换为日期/时间字符串时从UTC转换为客户端连接的时区

因此,如果您将
exec\u time
列存储为
时间戳
,您应该能够使用您建议的条款:

  WHERE exec_time <= UNIX_TIMESTAMP()

发出这些集合操作之一后,请执行以下操作

 SELECT exec_time, FROM_UNIXTIME(exec_time) 
了解如何在服务器端存储和转换您的值

如果您想知道八天后会发生什么,请尝试以下方法:

 SELECT 3600*24*8+exec_time, FROM_UNIXTIME(3600*24*8+exec_time) 

@OllieJones你能详细说明一下吗/@GordonM这是错的,因为你把“TIMESTAMP”拼错为“TIMESTANP”。@Lusitanian谢谢你的有用评论。:)修复了这个问题。这也是错误的,因为MySQL时间戳项目是以时区感知的方式处理的,即使它们没有用时区装饰存储。@OllieJones:当然?有无夏令时处理?谢谢。我将它们存储为一个无符号整数。从明天开始,GMT时间=UTC时间,所以理论上我给出的4am示例应该可以吗?在PHP中,我使用日期设置时区默认设置时区设置(“欧洲/都柏林”);然后使用mktime($hour、$min、0、$month、$day、$year);实际插入DB.GMT是UTC的旧名称,尽管是一年中的时间。你是说英国时间吗?您可以通过设置客户端时区=“+0:00”,然后如我所示进行查询来检查将发生什么。对不起,是的,我的意思是明天的BST=UTC。我的客户(目前)都在使用BST作为时区。我现在将尝试设置客户端时区。ThanksMysql将两个任务分别存储在午夜12点和凌晨4点,相隔5小时,这表明在某些阶段(我认为是PHP),日期在存储为unsigned int之前已正确转换。感谢您的帮助。
  SET time_zone='+0:00'   /* for UTC */
  SET time_zone'America/New_York' /* or 'Europe/Vienna' or whatever */
 SELECT exec_time, FROM_UNIXTIME(exec_time) 
 SELECT 3600*24*8+exec_time, FROM_UNIXTIME(3600*24*8+exec_time)