使用 PHP 在 MySQL 数据库中正确地从 UTC 转换为时区
Correctly converting to timezone from UTC in MySQL database with PHP
我看到 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 时区存储的数据库中读取您的日期
当您尝试将其转换为其他时区时,例如格林威治标准时间 + 5,
它将转移 7 小时而不是 5 小时
我看到 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 时区存储的数据库中读取您的日期
当您尝试将其转换为其他时区时,例如格林威治标准时间 + 5,
它将转移 7 小时而不是 5 小时