javascript — проблема с датой и временем разговора в зависимости от местного часового пояса.

Здравствуйте, сегодня я столкнулся с проблемой с преобразованием меток времени. В моей веб-форме я использую самозагрузки-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 вставляет в БД, как он был выбран правильно, без преобразования часового пояса.

1

Решение

Вы никогда не должны передавать даты с часовыми поясами от клиента к серверу, в этом случае всегда стоит руководить сервером, иначе у вас неизбежно возникнут проблемы несогласованности в вашей базе данных.

Вы либо:

  • Всегда используйте даты UTC + 0.
  • Используйте ключевые слова, которые представляют дату (т.е. вчера, сейчас, два дня назад).

Использование ключевого слова позволяет серверу решить, какую дату вы хотите, основываясь на часовом поясе UTC + 0.

TL; DR;

Всегда используйте UTC + 0 datetime и конвертируйте их на стороне сервера / клиента (это ваше предпочтение) в зависимости от того, в каком часовом поясе находится пользователь.

3

Другие решения

Вы можете использовать следующие 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');
}

Это может помочь вам синхронизировать часовой пояс

0