【问题标题】:Correctly converting to timezone from UTC in MySQL database with PHP使用 PHP 从 MySQL 数据库中的 UTC 正确转换为时区
【发布时间】:2020-06-16 02:04:54
【问题描述】:

我看到 phpmyadmin 中存储的日期值是 2020-03-03。在 PHP 中,我将默认时区设置为 UTC,将用户的时区设置为 America/New_York:

date_default_timezone_set('UTC');
$userTimeZone = new DateTimeZone('America/New_York');

我从数据库中检索我的日期,在日期上设置时区,并将其转换为字符串。现在等于提前一天。 (03-02-2020)

$dateNeeded = new DateTime($row['dateNeeded']); 
$dateNeeded->setTimeZone($userTimeZone);
$dateNeededStr = $dateNeeded->format('m-d-Y');

我在这里做错了什么?

【问题讨论】:

  • 如果您的存储日期中没有时间组件,如果该时区落后于存储日期之一,难道不应该在不同时区生成更早的日期吗?
  • 我不知道。这是这里的问题吗? MySQL中的数据类型是“日期”。

标签: php mysql date utc timezone-offset


【解决方案1】:

没有错。您的日期存储时不包含时间组件,这意味着当您将其放入 DateTime 构造函数时,它将被创建为午夜($dateNeeded = new DateTime($row['dateNeeded']) 将具有 2020-03-03 00:00:00 的值。

这是在 UTC 时区,因为您在一开始就这样定义了它。因此,当您更改时区时,它会向后移动(因为纽约是 UTC - 5)并获得 2020-03-02 19:00:00 的值。

由于您只以您的格式(而不是时间)输出日期,因此它会提前一天输出。

【讨论】:

  • 如何处理格式化并忽略时间组件?也许只是不使用 setTimeZone 分配时区?
【解决方案2】:

不要使用date_default_timezone_set('UTC');,因为 MySQL 服务器将使用服务器时区而不是 UTC,

例如,

您的服务器时区是 GMT +2

您将服务器时区设置为 GMT +0;

然后您在存储在 GMT + 2 时区的数据库中读取您的日期

当您尝试将其转换为其他时区时,例如格林威治标准时间 + 5,

它会移动 7 小时而不是 5 小时

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多