Создание выпадающего списка часовых поясов с PHP

Я не использовал бы HEREDOC вообще для этого, лично. Это просто не делает для хорошего "шаблона, создающего" систему. Весь Ваш HTML заблокирован вниз в строке, которая имеет несколько недостатков

  • опция No для WYSIWYG
  • Никакое завершение кода для HTML от IDE
  • Вывод (HTML), заблокированный в логические файлы
  • , Вы заканчиваете тем, что имели необходимость использовать взломы как то, что Вы пытаетесь сделать теперь для достижения более сложной шаблонной обработки, такой как цикличное выполнение

Получают основной движок шаблонов, или просто используют PHP с, включает - это - почему язык имеет <?php и ?> разделители.

template_file.php

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

index.php

<?php

$page_title = "This is a simple demo";

function getPageContent() {
    return '<p>Hello World!</p>';
}

include('template_file.php');
138
задан 0x6adb015 25 May 2017 в 13:32
поделиться

4 ответа

Я бы сделал это на PHP, за исключением того, что я бы не стал несколько раз выполнять preg_match 100 и сделал бы это для создания вашего списка.

$tzlist = DateTimeZone::listIdentifiers(DateTimeZone::ALL);

Кроме того, я бы использовал имена PHP для «часовых поясов» и забыл о смещениях по Гринвичу, которые будут меняться в зависимости от летнего времени. Такой код в phpbb - это только такой способ, потому что они все еще поддерживают PHP4 и не могут полагаться на присутствующие там объекты DateTime или DateTimeZone.

172
ответ дан 23 November 2019 в 23:26
поделиться

первый вариант позволит вам взять значение из $ _POST ['whateveryoucalltheselect'] и добавить его в UTC. или даже сохраните это значение, а затем всегда вызывайте UTC + userTZsetting, когда вам это понадобится позже. мне кажется самым простым. последний вариант был бы гораздо более ценным, если бы часовые пояса менялись часто.

0
ответ дан 23 November 2019 в 23:26
поделиться

Ни один из них. Вместо этого подготовьте массив в PHP с этими часовыми поясами. Подобно

$arr[0] = "(GMT+02:00) Harare, Pretoria";
$arr[1] = "(GMT+03:00) Jerusalem";

или

$arr[0] = array("America/Campo_Grande", "(GMT+02:00) Harare, Pretoria");
$arr[1] = array("America/Israel", "(GMT+03:00) Jerusalem");

и так далее. Затем сгенерируйте форму на основе этого массива:

foreach ($arr as $k => $v)
   $str .= "<option value=$k>$v[1]</option>";

И тогда вы можете легко переключаться на другие форматы, просто изменив код в строке выше. Также проверка будет намного проще и не потребует регулярных выражений. Просто сравните значение, отправленное POST или GET, с массивом. Теперь легко установить, что $ arr [$ value_sent_by_form] [0] содержит значение, совместимое с PHP, а $ arr [$ value_sent_by_form] [1] удобное для пользователя значение.

0
ответ дан 23 November 2019 в 23:26
поделиться

Я бы сделал это с помощью следующего кода, который похож на принятый ответ (я знаю, что код можно отредактировать :)):

    $list = DateTimeZone::listAbbreviations();
    $idents = DateTimeZone::listIdentifiers();

    $data = $offset = $added = array();
    foreach ($list as $abbr => $info) {
        foreach ($info as $zone) {
            if ( ! empty($zone['timezone_id'])
                AND
                ! in_array($zone['timezone_id'], $added)
                AND 
                  in_array($zone['timezone_id'], $idents)) {
                $z = new DateTimeZone($zone['timezone_id']);
                $c = new DateTime(null, $z);
                $zone['time'] = $c->format('H:i a');
                $offset[] = $zone['offset'] = $z->getOffset($c);
                $data[] = $zone;
                $added[] = $zone['timezone_id'];
            }
        }
    }

    array_multisort($offset, SORT_ASC, $data);
    $options = array();
    foreach ($data as $key => $row) {
        $options[$row['timezone_id']] = $row['time'] . ' - '
                                        . formatOffset($row['offset']) 
                                        . ' ' . $row['timezone_id'];
    }

    // now you can use $options;

function formatOffset($offset) {
        $hours = $offset / 3600;
        $remainder = $offset % 3600;
        $sign = $hours > 0 ? '+' : '-';
        $hour = (int) abs($hours);
        $minutes = (int) abs($remainder / 60);

        if ($hour == 0 AND $minutes == 0) {
            $sign = ' ';
        }
        return 'GMT' . $sign . str_pad($hour, 2, '0', STR_PAD_LEFT) 
                .':'. str_pad($minutes,2, '0');

}

Это дает что-то вроде:

<option value="America/Boise" label="02:10 am - GMT-06:00 America/Boise">02:10 am - GMT-06:00 America/Boise</option>

<option value="America/Denver" label="02:10 am - GMT-06:00 America/Denver">02:10 am - GMT-06:00 America/Denver</option>
<option value="America/Edmonton" label="02:10 am - GMT-06:00 America/Edmonton">02:10 am - GMT-06:00 America/Edmonton</option>
<option value="America/Inuvik" label="02:10 am - GMT-06:00 America/Inuvik">02:10 am - GMT-06:00 America/Inuvik</option>
<option value="America/Shiprock" label="02:10 am - GMT-06:00 America/Shiprock">02:10 am - GMT-06:00 America/Shiprock</option>

<option value="America/Belize" label="02:10 am - GMT-05:00 America/Belize">02:10 am - GMT-05:00 America/Belize</option>

Надежда, которая немного помогает и / или вдохновляет вас на создание чего-то лучшего.

23
ответ дан 23 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: