2017-01-12 4 views
1

Привет, сегодня я столкнулся с проблемой конверсий с отметками времени. В моей веб-форме я использую bootstrap-datepicker, где пользователи могут выбирать дату и время. После этого я конвертирую эти значения с moment.js в unix timestamp и передать его на страницу PHP. На странице PHP, если пользователь находится в другой стране, значение отличается и в конце в базу данных вставлено неправильное значение. Итак, как часовой часовой пояс сервера Латвия/Рига GMT + 2 и пользователь от Грузия/Тбилиси имеет GTM + 4. Он выбирает дату начала 12.01.2017 15:00, Moment.js передает его на страницу PHP в DB значение даты начала вставляется 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"); 

после вар передается через AJAX для PHP скрипт как start.unix()

В PHP получает

$startDate  = date('Y-m-d H:i:s', $_GET['start']); 

А время получили 2 часов назад .. Что я могу сделать, чтобы пользователь выбирал время из любого места в мире. PHP вставляет в БД, как он правильно выбирается без часовой пояс преобразование.

+1

Вы лучше от всего сохраняя все время в UTC и сохраняя часовой пояс клиента отдельно. – GordonM

ответ

2

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

Вы либо:

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

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

TL; DR;

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

+0

Благодарим за отзыв! Он хорошо работает, просто протестирован. Хорошего дня! – Sangsom

0

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

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