我有一个PHP MySQL查询,它将一些数据插入MySQL数据库,并包含一个时间戳。
目前,INSERT
查询使用NOW()
作为时间戳列,并以以下格式保存在数据库中:2012-07-24 13:13:02
不幸的是,服务器不在我的时区,它被列为America/Loss_Angeles,如print date_default_timezone_get();
所示
我希望做以下事情:
date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());
并简单地将CCD_ 5代替CCD_;
这是保存此类数据的好方法吗?
非常感谢,
Richard
[添加文本]
我将MySQL数据库中的Type更改为DateTime
,并执行了以下操作:
date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());
这是有效的,但我还没有得到整体的概念。
Assumptions based on your comments:
- MySQL=没有UTC数据类型,您只需使用INT类型即可
- Unix_TimeStamp()将保存当前时间还是计数?UTC格式,例如1343247227
- 由于UTC是一个从公共0点开始的计数,您可以从中获取任何时区。假设您不希望日期在1970年的参考0点之前
根据我的猜测和你所说的,最好的方法是将时间保存为INT中的UTC(1343247227),然后从中生成你想要的任何时区。再次假设您不需要存储1970年参考0点之前的日期。
同样,为什么不在已知时区存储为日期时间YYYY-MM-DD HH:MM:SS,然后转换为UTC或其他时区呢。这一切看起来都很混乱=(
正如@Petah在评论中所说,将您的时间存储在UTC中,并根据需要将其隐藏在应用程序中。
Unix时间戳是UTC,所以我通常将时间作为时间戳存储在数据库中。这省去了先转换为UTC插入,然后在选择时从UTC转换的麻烦和混乱。
也就是说,使您的时间字段为INT
类型,并在插入时使用MySQL中的函数UNIX_TIMESTAMP()
,或者使用time()
函数从PHP获取时间戳。
当你从数据库中获取时间戳时,它将以UTC为单位,但当你使用date()
在PHP应用程序中显示它时,它会显示在服务器时区,或者你用date_default_timezone_set
设置的任何时区。
因此,以下两个查询将起作用:
INSERT INTO `table` (id, time) VALUES(NULL, UNIX_TIMESTAMP());
// or
$time = time();
$query = "INSERT INTO `table` (id, time) VALUES(NULL, $time);
如果你想从数据库中选择它作为DATETIME
,你可以这样做:
SELECT *, FROM_UNIXTIME(time) as dt FROM `table` WHERE 1
生成的dt
列将采用yyyy-MM-dd hh:mm:ss
格式。
您可以使用date()
在PHP中格式化数字时间戳
如果你的PHP版本是64位的,你不局限于1970-2036的范围,PHP将支持64位的时间戳,在这种情况下,只需确保在MySQL中使用BIGINT
列。
希望能有所帮助。