Преобразование даты JavaScript в PHP - PullRequest
0 голосов
/ 22 января 2019

Я использую этот компонент Vue на своем веб-интерфейсе, который позволяет моему пользователю выбирать дату и время.Как таковой, он предоставляет дату / время в формате ISO 8601.Затем я делал это для преобразования для базы данных:

$dt = $request->pickup_date_time;
$formattedDt = date('Y-m-d H:i:s', strtotime($dt));

Однако я обнаружил, что при наличии разницы во времени между клиентом и сервером преобразованная дата отключается.

Например, пользователь в Техасе может выбрать 10 часов утра, но когда он обрабатывает данные на сервере, он преобразуется в 4 часа дня (разница во времени между Техасом и Лондоном 6 часов).

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

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вам необходимо найти разницу часовых поясов между сервером и пользователем.Для этого вам нужно использовать javascript & jquery.

Мы собираемся получить смещение часового пояса с помощью jquery и сохранить его в сеансе.Перед добавлением даты пользователя в базу данных мы добавим это смещение.

Проверьте getTimezoneOffset (javascript)

Шаг 1: Если смещение часового пояса опубликовано,сохраните его в наборе user_timezone.

Шаг 2: если не установлено значение user_timezone, получите его.

Шаг 3: Добавьте это смещение к дате, выбранной пользователем.Затем вставьте его в базу данных.

Позволяет создать новый файл php.И включите его, прежде чем позволить пользователю выбрать дату.

    <?php
        if (!isset($_SESSION)) {
            session_start();
        }
        //If timezone_offset is posted, save it as user_timezone
         if (isset($_POST['timezone_offset'])) {
            $_SESSION['user_timezone'] = $_POST['timezone_offset'];
        }
        //If user_timezone is not exist, get it.
        else if (!isset($_SESSION['user_timezone'])) {
    ?>
        //Include jQuery
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
        <script>
            $(document).ready(function(){
                var url = location.href;
                var timezone_offset = new Date().getTimezoneOffset();
                    var posting = $.post( url, { timezone_offset: timezone_offset } );
                    posting.done(function() {
                        location.reload();
                    });
            });
        </script>
    <?php
        }
    ?>

Мы получаем смещение.Теперь давайте добавим это смещение к дате.

$dt = $request->pickup_date_time;
$Fdate = strtotime($dt) + (60 * $_SESSION['user_timezone']);

Теперь вы можете вставить $ Fdate в свою базу данных.

Для отображения этой даты в местном часовом поясе:

$Fdate = $Fdate - (60 * $_SESSION['user_timezone']);
$formattedDt = date('Y-m-d H:i:s', $Fdate);

Извините за мой английский, английский не мой родной язык.

0 голосов
/ 22 января 2019

Фактическая спецификация ISO8601 включает часовой пояс.Если это не указано в строке, принимающий сервер сделает предположение, что, вероятно, это неверно.Поэтому решение состоит в том, чтобы включить часовой пояс в строку даты.

$preferred_timezone = new DateTimeZone('America/Vancouver');
$t = new DateTime('now', $preferred_timezone);

var_dump(
    $t->format('c'),
    $t->format(DateTime::ISO8601),
    $t->format('Y-m-d H:i:sP')
);

Вывод:

string(25) "2019-01-21T16:39:08-08:00"
string(24) "2019-01-21T16:39:08-0800"
string(25) "2019-01-21 16:39:08-08:00"

Если принимающая сторона не может правильно обрабатывать часовой пояс и имеет значение только притворившись ISO8601- ish , вам нужно настроить приложение на знание того, что ожидает удаленный сервер, и соответственно выполнить перевод.

$preferred_timezone = new DateTimeZone('America/Vancouver');
$remote_timezone = new DateTimeZone('Europe/Paris');

$t = new DateTime('now', $preferred_timezone);
$t->setTimeZone($remote_timezone);

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

Вывод:

string(19) "2019-01-22 01:42:54"
0 голосов
/ 22 января 2019

Если вы публикуете pick_date_time как отметку времени UNIX и сохраняете ее, вам не нужно будет выполнять разбор строк на уровне php. Затем вы можете использовать эту метку времени в JS для рендеринга в часовом поясе браузера.

...