PHP - Отображение данных в разных часовых поясах - PullRequest
2 голосов
/ 28 мая 2020

Привет, сообщество stackoverflow.

Я разрабатываю веб-приложение, и его концепция состоит в том, чтобы отображать исторические курсы обмена валют на основе временных рядов из прошлого.

Например, пользователь может запросить курсы обмена с 13:00 22 мая 2020 г. по 22:00 26 мая 2020 г. Затем мой бэкэнд запускает al oop и получает ставки между этими двумя датами и временем каждый час.

Все ставки в базе данных хранятся в часовом поясе GMT.

И вот проблема. Предположим, пользователь делает запрос со смещением часового пояса +10: 00. Так что, если этот пользователь выберет в качестве последней даты время 26 МАЯ 2020 22:00, я думаю, мне следует взять из своей базы данных скорость на 26 МАЯ 2020 12:00, чтобы вычесть 10 часов.

Пусть это звучит глупо , но я застрял в этом.

Что такое мой лог c:

a) Получить смещение часового пояса пользователя через javascript во внешнем интерфейсе

var get_timezone_offset = new Date().getTimezoneOffset();

var hrs = parseInt(-(timezone_offset / 60));

var mins = Math.abs(timezone_offset % 60);

var timezone_offset = hrs + ':' + mins;

b) Отправлять смещение часового пояса пользователей на мой сервер

c) Получать ставки из моей базы данных и конвертировать дату, сохраненную из GMT, в смещение часового пояса пользователя с помощью объекта Datetime PHP

$date = new \DateTime('2020-05-26 22:00');

$date->modify(-10 hours);

$date->format('Y-m-d H:i:s');

Это верно? Я не буду показывать неправильные ставки своим пользователям.

Заранее спасибо

1 Ответ

2 голосов
/ 28 мая 2020

Пожалуйста, прочтите вики-страницу timezone tag , особенно раздел под названием «Часовой пояс! = Смещение». Короче говоря, вы не можете предположить, что смещение, полученное сейчас от пользователя, такое же, как и в любой другой момент времени.

Простой пример для часовых поясов, таких как America/New_York , который сейчас равен UT C -4, но переключится на UT C -5, когда в ноябре закончится летнее время. Но, помимо летнего времени, для многих часовых поясов были изменены их стандартные временные смещения.

Вместо получения текущего числового c смещения получите идентификатор часового пояса IANA из браузера.

const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
// example: "America/New_York", "Asia/Kolkata", "Europe/Athens", etc.

Затем вы можете использовать этот идентификатор со встроенной поддержкой PHP часового пояса. Например, следующее преобразует местное время в данном часовом поясе в эквивалентное время в UT C:

$tz = new DateTimeZone("America/New_York");
$date = new DateTime('2020-05-26 22:00', $tz);
$date->setTimeZone(new DateTimeZone("UTC"));
echo $date->format('Y-m-d H:i:s');
...