фильтровать даты в php в соответствии с часовым поясом, выбранным из пользовательского интерфейса - PullRequest
6 голосов
/ 05 апреля 2019

Я работаю над кодом php, как показано ниже, с датой air_date, которую я хочу изменить при выборе другого часового пояса из UI .

Код Php:

$cols = array(
    'e.description_' . $opp_lang . ' as translation',
    's.air_date',  // This is the entry point of air_date and its been used everywhere. 
    'e.program_id',
); 

Логика, которую я использовал для часового пояса:

function tz_translations( $lang = 'en' ) {
    $tz_translations = [
        'en' => [
            'PST' => [
                'label' => 'PT',
                'diff'  => 'subtract 3 hours',
            ],
            'EST' => [
                'label' => 'ET',
                'diff'  => 'subtract 0 hours',
            ],
        ],
        'fr' => [
            'HNP' => [
                'label' => 'HP',
                'diff'  => 'subtract 3 hours',
            ],
            'HNE' => [
                'label' => 'HE',
                'diff'  => 'subtract 0 hours',
            ],
        ],
    ];

    return $tz_translations[ $lang ];
}   

UI (код JS): enter image description here

<ul id="js-timezone-picker">
   <?php foreach ( $tz_translations as $key => $tz ) :
      $tz_param = strtolower( $tz['label'] );
      $active = ( $current_tz === $key ) ? 'active' : '';
      ?>
   <li>
      <button id="<?php echo esc_attr( 'js-time-' . $tz_param ) ?>"
         class="<?php echo sanitize_html_class( $active ) ?>"
         data-timezone="<?php echo esc_attr( $tz_param ) ?>"><?php echo esc_html( $tz['label'] ) ?></button>
   </li>
   <?php endforeach; ?>
</ul>

Когда выбран PT / ET, при проверке он становится следующим:

<button id="js-time-pt" class="" data-timezone="pt">PT</button>
<button id="js-time-et" class="" data-timezone="et">ET</button>

Постановка задачи:

Мне интересно, какие изменения я должен внести в php код выше, чтобы при выборе различных часовых поясов из кода UI / JS , air_date в коде php изменяется автоматически в соответствии с часовыми поясами.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

На ваш вопрос нелегко ответить.Для меня непонятно, как ваши куски кода висят вместе или что именно они представляют.Поэтому я думаю, что лучше всего начать с некоторых общих практических определений.

Внутренний часовой пояс

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

Внешний часовой пояс

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

Преобразование с помощью PHP

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

Это означает, что вам необходимо сохранитьчасовой пояс, выбранный пользователем с вашим приятным пользовательским интерфейсом, таким образом, чтобы он был легко доступен из PHP.Наиболее распространенный способ сделать это - сохранить его в сеансе .Обычно это делается с помощью AJAX-вызова из Javascript в серверную часть PHP. JQuery может облегчить использование AJAX.

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

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

$internalTimeStr = '2019-04-12 13:33:20';

Это значение легко преобразовать во время, которое может использовать PHP:

$internalTime = strtotime($internalTimeStr);

И наоборот:

$internalTimeStr = date('Y-m-d H:i:s', $internalTime);

Теперь предположим, что посетитель вашего сайта выбрал «America / New_York» в пользовательском интерфейсе для представления восточного времени.Вы можете использовать этот выбор для преобразования внутреннего времени во внешнее время.

function utc2local($utc,$localTimezone)
{
    $dt = new DateTime($utc);
    $dt->setTimezone(timezone_open($localTimezone));
    return $td->getTimestamp();
}

// we know this
$externalTimezone = 'America/New_York';     // from session / UI
$internalTimeStr  = '2019-04-12 13:33:20';  // from database / system
// and this is the conversion
$internalTime     = strtotime($internalTimeStr);
$externalTime     = utc2local($internalTime,$externalTimezone);
$externalTimeStr  = date('Y-m-d H:i:s', $externalTime);

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

Причина использования функций, встроенных в PHP, заключается в том, что время трудно , действительно трудно .

Теперь вы можете использовать это внешнее время, чтобы показывать время вашим посетителям.

Заключение

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

0 голосов
/ 05 апреля 2019

Если это просто преобразование и вам не нужна другая информация о сервере, вы должны передать все данные на клиентскую сторону (например, в формате json), а затем с помощью кнопки запустить функцию Javascript, которая выполняет ваше конкретное преобразование. Но если вам нужно изменить объекты php, вам нужен запрос к серверу (get, post или Ajax).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...