Преобразование часового пояса Windows в эквивалент для настроек PHP

Я занимаюсь разработкой приложения, состоящего из веб-сервера с использованием PHP и MySQL, работающего в Windows, к которому пользователь обращается через веб-браузер, настроенный на http://localhost, Но я хочу, чтобы он работал во всех часовых поясах Соединенных Штатов, включая большую часть штата Аризона, где нет летнего времени. Чтобы настроить этот скрипт, мне нужно, чтобы PHP использовал тот же часовой пояс, что и Windows.

У меня есть сценарий PHP, который получает часовой пояс из командной строки в Windows. Затем результаты необходимо преобразовать в эквивалентный часовой пояс в Список PHP.

К сожалению, я не вижу прямого способа сделать это. Вот сценарий:


$comp_timezone = exec('systeminfo | findstr  /C:"Time Zone"');
// results are: "Time Zone: (UTC-07:00) Arizona"
date_default_timezone_set($comp_timezone);


Что мне нужно сделать, это преобразовать строковый результат из $comp_timezone в то, что функция date_default_timezone_set можно использовать, но, как показывает приведенный выше пример, Аризона не существует в качестве часового пояса для PHP, ближайший будет America/Phoenix,

Так как мне конвертировать systeminfo часовой пояс к PHP один?

2

Решение

Несколько вещей:

  1. systeminfo Команда просто показывает вам отображаемое имя часового пояса Windows. Вам понадобится идентификатор. Ты можешь использовать tzutil.exe /g чтобы вернуть это - хотя это все равно не поможет вам здесь.

  2. PHP использует часовые пояса IANA, а не часовые пояса Windows. Увидеть тег часового пояса вики для получения дополнительной информации о двух разных типах часовых поясов.

  3. Перевод между ними осуществляется CLDR в этот файл.

  4. Для PHP вы можете получить доступ к данным CLDR через Пакет интернационализации. Включите это, добавив (или раскомментировав) к вашему php.ini файл:

    extension=php_intl.dll
    
  5. Затем вы можете просто вызвать следующую функцию, чтобы вернуть местный часовой пояс в качестве идентификатора IANA. (Внутренне, он опирается на ICU и CLDR для перевода.)

    IntlTimeZone::createDefault()->getID()
    

    Это вернется "America/Phoenix" в вашем примере. Затем вы можете использовать его с любыми обычными функциями часового пояса PHP, включая date_default_timezone_set если хочешь.

  6. Хотя ты Можно сделайте это, подумайте о том, действительно ли вы должен сделай это. В большинстве случаев использование системного часового пояса системы из веб-приложения (или любого серверного приложения) является антишаблоном. Слишком легко изменить часовой пояс. Это глобальная настройка, которая обычно не требует каких-либо прав администратора. Также проблематично, если ваши данные не основаны на UTC, и вы затем пытаетесь перенести их с одного сервера на другой. В подавляющем большинстве случаев лучше думать о часовом поясе на уровне логики приложения, а не в масштабе всей системы или приложения, и обычно следует учитывать часовой пояс сервера, на котором размещен ваш код. не имеет значения.

5

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


Мое решение состоит в том, чтобы зациклить DateTimeZone::listIdentifiers() и попытаться найти совпадение, т.е.

$comp_timezone = exec('systeminfo | findstr  /C:"Time Zone"');
//Time Zone: (UTC +01:00) Lisbon
//we match the last word of $comp_timezone
preg_match_all('/(\w+)$/', $comp_timezone, $rawTz, PREG_PATTERN_ORDER);
$rawTz = $rawTz[1][0]; //Lisbon

foreach (DateTimeZone::listIdentifiers() as $timezone) {
if(preg_match("/.*?\/$rawTz/", $timezone)){
echo $timezone;
//Europe/Lisbon
}
}

Live Demo


Заметки:

  1. America/Arizona не существует как действительный DateTimeZone в PHP,
  2. DateTimeZone доступно только на PHP 5 >= 5.2.0, PHP 7
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector