我有一个PHP MySQL查询,它将一些数据插入MySQL数据库,它包含一个时间戳。
目前,INSERT
查询使用NOW()
作为时间戳列,并以下列格式保存在数据库中:2012-07-24 13:13:02
不幸的是,对我来说,服务器不在我的时区,它被列为America / Los_Angeles,显示为print date_default_timezone_get();
我希望做到以下几点:
date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());
并简单地将$timefordbLondonEU
代替NOW()
;
这是保存此类数据的好方法吗?
非常感谢,
理查德
[已添加文字]
我将MySQL数据库中的Type更改为DateTime
并执行以下操作:
date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());
它正在运作,但我还没有得到整体概念。
Assumptions based on your comments:
我的猜测和引导来自你所说的最好的方法是将时间保存为INT(1343247227),然后从那里生成你想要的任何时区。再假设您不需要在1970年的参考0点之前存储日期。
同样为什么不在已知时区存储日期时间YYYY-MM-DD HH:MM:SS,然后转换为UTC或其他时区。这一切看起来都很混乱=(
答案 0 :(得分:7)
正如@Petah在评论中所说,将你的时间存储在UTC中并根据需要将它们隐藏在应用程序中。
Unix时间戳以UTC为单位,因此我通常将时间存储在数据库中作为时间戳。这样可以省去第一次转换为UTC以进行插入时的头痛和困惑,然后在选择时从UTC中解除。
也就是说,将您的时间字段设为INT
类型,并在插入时使用MySQL中的函数UNIX_TIMESTAMP()
,或使用time()
函数从PHP获取时间戳。
从数据库中获取时间戳时,它将以UTC格式显示,但是当您使用date()
在PHP应用程序中显示时间戳时,它将显示在服务器时区中,或者您使用{{1}设置的任何内容}。
因此,以下两个查询将起作用:
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
。
您可以使用date()
如果您拥有的PHP版本是64位,则不限于1970 - 2036年范围,PHP将支持64位时间戳,只需确保在MySQL中使用yyyy-MM-dd hh:mm:ss
列即可情况下。
希望有所帮助。