我对 php/mysql 日期/时间函数完全困惑。
我的 date
列是 timestamp
- 默认值 - 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 小时的时差。
我怎样才能获得正确的时间(尊重我的时区),并且如果可能的话,每个用户,无论他位于地球上的哪个地方,都能获得尊重他自己的时区的数据?
最佳答案
MySQL 根本不保存时区。根据您使用存储的数据的用途,您应该始终将日期时间值存储为“UTC”(这类似于 GMT,根本没有 TZ 偏移量),或者在某些情况下您希望将其存储为偏移量已经设置。但对于第二个选项,您还应该将 TZ 或偏移量存储在其他地方(同样,MySQL 日期时间无法存储它),以便从数据库正确重建对象。
例如,我通常在数据库记录中添加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 中,但出于显示目的(例如想知道是否可以在正常时间调用)并让家人知道他/她到达了 好的)您稍后将其转换为原点 tz:
$checkinAt = new DateTimeImmutable(
$row->checkin_at,
new DateTimeZone('Europe/Madrid')
);
$checkinAt->setTimezone('America/Argentina/Buenos_Aires');
总结一下:
- 您需要知道日期是如何存储的,如果您将所有日期存储在 UTC 中(例如没有偏移量),那么会更简单,但是如果您需要访问假设已经有偏移量的数据,则在查询数据时可能会遇到问题。
- MySQL 不会存储 TZ 及其日期时间值。
- 确保使用正确的时区实例化 DateTime 对象,如果您不在构造函数中传递任何时区,PHP 将使用默认的 TZ。这是set on the php.ini你可以用这个 function
date_default_timezone_set
来改变它在你的脚本中。
关于php - 如何获取尊重用户时区的日期和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274565/