我看到在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');
我在这里做错了什么?
这是不正确的。您存储的日期没有时间部分,这意味着当您将其放入DateTime
构造函数时,它将创建为午夜($dateNeeded = new DateTime($row['dateNeeded'])
的值为2020-03-03 00:00:00
。
这是UTC时区,因为您一开始就定义了它。因此,当您更改时区时,它将移回(因为纽约是UTC-5)并获得2020-03-02 19:00:00
的值。
由于您仅以格式(而不是时间)输出日期,因此它会提前一天出现。
不要使用date_default_timezone_set('UTC');
,因为MySQL服务器将使用服务器时区而不是UTC,
例如,
您的服务器所在时区为GMT +2
并且您将服务器时区设置为GMT +0;
然后,您在存储在GMT + 2时区的数据库中读取日期
[当您尝试将其转换为其他时区时,例如GMT + 5,
它将转移7小时而不是5小时