Я занимаюсь разработкой приложения, состоящего из веб-сервера с использованием 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 один?
Несколько вещей:
systeminfo
Команда просто показывает вам отображаемое имя часового пояса Windows. Вам понадобится идентификатор. Ты можешь использовать tzutil.exe /g
чтобы вернуть это - хотя это все равно не поможет вам здесь.
PHP использует часовые пояса IANA, а не часовые пояса Windows. Увидеть тег часового пояса вики для получения дополнительной информации о двух разных типах часовых поясов.
Для PHP вы можете получить доступ к данным CLDR через Пакет интернационализации. Включите это, добавив (или раскомментировав) к вашему php.ini
файл:
extension=php_intl.dll
Затем вы можете просто вызвать следующую функцию, чтобы вернуть местный часовой пояс в качестве идентификатора IANA. (Внутренне, он опирается на ICU и CLDR для перевода.)
IntlTimeZone::createDefault()->getID()
Это вернется "America/Phoenix"
в вашем примере. Затем вы можете использовать его с любыми обычными функциями часового пояса PHP, включая date_default_timezone_set
если хочешь.
Хотя ты Можно сделайте это, подумайте о том, действительно ли вы должен сделай это. В большинстве случаев использование системного часового пояса системы из веб-приложения (или любого серверного приложения) является антишаблоном. Слишком легко изменить часовой пояс. Это глобальная настройка, которая обычно не требует каких-либо прав администратора. Также проблематично, если ваши данные не основаны на UTC, и вы затем пытаетесь перенести их с одного сервера на другой. В подавляющем большинстве случаев лучше думать о часовом поясе на уровне логики приложения, а не в масштабе всей системы или приложения, и обычно следует учитывать часовой пояс сервера, на котором размещен ваш код. не имеет значения.
Мое решение состоит в том, чтобы зациклить 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
}
}
Заметки:
America/Arizona
не существует как действительный DateTimeZone
в PHP
,DateTimeZone
доступно только на PHP 5 >= 5.2.0, PHP 7