Здравствуйте, сегодня я столкнулся с проблемой с преобразованием меток времени. В моей веб-форме я использую самозагрузки-DatePicker где пользователи могут выбрать дату и время. После этого я конвертирую эти значения с moment.js в метка времени Unix и передать его на страницу PHP. На странице PHP, если пользователь находится в другой стране, значение отличается и в конце в базу данных вставляется неправильное значение.
Так что это похоже на часовой пояс сервера Латвия / Рига GMT + 2 и пользователь из Грузия / Тбилиси имеет GTM + 4. Он выбирает дату начала 12.01.2017 15:00, Moment.js передает его на страницу PHP в БД вставляется значение даты начала 12.01.2017 13:00.
Вот код от JS
var start_date = $("#start_date").val();
var start_time = $("#start_time").val();
var start = moment.utc(start_date + ' ' + start_time, "DD.MM.YYYY HH:mm").tz("Europe/Riga");
после этого var передается через ajax в PHP-скрипт, например start.unix()
В PHP он получает
$startDate = date('Y-m-d H:i:s', $_GET['start']);
И время получено на 2 часа раньше ..
Что я могу сделать, чтобы пользователь выбирал время из любой точки мира, где PHP вставляет в БД, как он был выбран правильно, без преобразования часового пояса.
Вы никогда не должны передавать даты с часовыми поясами от клиента к серверу, в этом случае всегда стоит руководить сервером, иначе у вас неизбежно возникнут проблемы несогласованности в вашей базе данных.
Вы либо:
Использование ключевого слова позволяет серверу решить, какую дату вы хотите, основываясь на часовом поясе UTC + 0.
TL; DR;
Всегда используйте UTC + 0 datetime и конвертируйте их на стороне сервера / клиента (это ваше предпочтение) в зависимости от того, в каком часовом поясе находится пользователь.
Вы можете использовать следующие JS, чтобы получить часовой пояс клиента в JS:
var time_zone = Intl.DateTimeFormat().resolvedOptions().timeZone;
var start_date = $("#start_date").val();
var start_time = $("#start_time").val();
В PHP:
function getDateTime($start_date, $start_time, $time_zone) {
$dateTime = $start_date . ' ' . $start_time;
$date = new DateTime($dateTime, new DateTimeZone($time_zone));
$serverTimeZone = date_default_timezone_get();
$date->setTimezone(new DateTimeZone($serverTimeZone));
return $date->format('Y-m-d H:i:sP');
}
Это может помочь вам синхронизировать часовой пояс