使用PHP在MySQL数据库中从UTC正确转换为时区

问题描述 投票:0回答:2

我看到在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');

我在这里做错了什么?

php mysql date utc timezone-offset
2个回答
1
投票

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

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

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


0
投票

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

例如,

您的服务器所在时区为GMT +2

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

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

[当您尝试将其转换为其他时区时,例如GMT + 5,

它将转移7小时而不是5小时

© www.soinside.com 2019 - 2024. All rights reserved.