Правильное преобразование в часовой пояс из UT C в MySQL базе данных с PHP - PullRequest
0 голосов
/ 03 марта 2020

Я вижу, что хранимое значение даты в phpmyadmin - 2020-03-03. В PHP я устанавливаю часовой пояс по умолчанию UT C, а часовой пояс пользователя - 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');

Что я тут неправильно сделал?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Это не неправильно. Ваша дата сохраняется без компонента времени, что означает, что когда вы поместите ее в конструктор DateTime, она будет создана как полночь ($dateNeeded = new DateTime($row['dateNeeded']) будет иметь значение 2020-03-03 00:00:00.

Это в UT C часовой пояс, потому что вы определили его так в начале. Поэтому, когда вы измените часовой пояс, он вернется назад (как в Нью-Йорке UT C - 5) и получит значение 2020-03-02 19:00:00.

Поскольку вы выводите только дату в своем формате (а не время), она выходит на день раньше.

0 голосов
/ 03 марта 2020

Не использовать date_default_timezone_set('UTC');, поскольку MySQL сервер будет использовать часовой пояс сервера, а не UT C,

Например,

Часовой пояс вашего сервера - GMT + 2

И вы устанавливаете часовой пояс вашего сервера на GMT +0;

Затем вы читаете свою дату в базе данных, которая хранится в часовом поясе GMT ​​+ 2

Когда вы пытаетесь преобразовать его в другой часовой пояс, например, GMT + 5,

Это сместит 7 часов, а не 5 часов

...