php - 如何获取尊重用户时区的日期和时间

标签 php mysql datetime

我对 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/

相关文章:

mysql - 同一查询中 count() 的平均值

php - SQLSTATE[23000] : Integrity constraint violation: 1048 Column 'stickers' cannot be null Laravel

php - 使用 AM/PM 将字符串转换为 mysql 日期时间

mysql - sql 不正确的日期时间值

PHP:只允许字符串中的某些字符,而不使用正则表达式

php - JSON 到 Javascript 对象文字表示法?

php - session 变量不持久

PHP 拒绝在框架网格中显示 mysql 数据

python - 按小时向下舍入日期时间列

javascript - 将 Gridster 插入 WordPress 模板