我对php / mysql日期/时间函数感到困惑
我的date
列为timestamp
- defalult值 - current_timestamp
。
date_default_timezone_set("Europe/Belgrade"); //my timezone
$stmt = $db->query("SELECT * FROM cinema order by date desc");
while($row = $stmt->fetch()){
$date = strtotime($row['date']);
$datea = date("d-m-y", $date);
$time = date("H:i", $date);
...
与当地时间相比,我的差距为-2小时。
如何才能获得正确的时间(尊重我的时区),并且如果可能的话,每个用户(无论他位于地球上)是否都能获得关于他自己时区的数据?
答案 0 :(得分:2)
MySQL根本不保存时区。根据您使用存储数据的内容,您应始终将日期时间值存储在" UTC" (这就像GMT一样,完全没有TZ偏移)或者在某些情况下你想用已经设置的偏移来存储它。但是对于第二个选项,您还应该将TZ或偏移量存储在其他地方(同样,MySQL日期时间无法存储),以便从数据库中正确地重建对象。
例如,我通常在我的db记录中添加created_at,updated_at字段并将其存储在UTC中,对于此任务,我使用PHP's gmdate('Y-m-d H:i:s')
现在,如果你必须在用户的TZ中显示这个日期时间,你只需创建一个这样的DateTime对象并更改TZ:
$createdAt = new DateTimeImmutable(
$row->created_at,
new DateTimeZone('UTC')
);
对于第二种情况,您可以使用额外的数据存储日期时间,同时保存TZ,您必须确保使用timezone constructor second argument实例化DateTime对象以正确移动偏移量。因此,对于将前往马德里的阿根廷人来说,您可能希望将登记日期存储在目的地的TZ(例如马德里),但是出于显示目的,(例如想知道是否可以在正常时间呼叫)让家人知道他/她到了Ok)你后来将它转换为原点tz:
$checkinAt = new DateTimeImmutable(
$row->checkin_at,
new DateTimeZone('Europe/Madrid')
);
$checkinAt->setTimezone('America/Argentina/Buenos_Aires');
总结一下:
date_default_timezone_set
进行更改。答案 1 :(得分:1)
你可以在sql查询中非常甜蜜地完成它
CONVERT_TZ(dt,from_tz,to_tz)
http://www.w3resource.com/mysql/date-and-time-functions/mysql-convert_tz-function.php
$stmt = $db->query("SELECT *, CONVERT_TZ(date, "+00:00", "+01:00") FROM cinema order by date desc");
^假设您的数据库是UTC时间,您尝试转换的时间是" Europe / Belgrade"。
第一个参数是您的日期时间戳,第二个是您的数据库时区,第三个是您希望它转换为的时间。如果时区更改是针对查询的where / conditional部分,那么您可以将其放置在相反的位置。
答案 2 :(得分:-1)
获取用户或浏览器时间。您必须拥有自己的时区,可以从Link获得。
请按以下步骤操作:
如果您仍然很难过,请告诉我。