В общем, на данный момент нашел 2 более-менее готовых решения:
1) Геолокация по IP.
Плюсы: реализовано для Yii2, можно узнать страну, регион и город пользователя, что кроме часового пояса дает нам информацию о предполагаемом языке и валюте пользователя. Хотя, браузеры собирают языковые предпочтения пользователя, так что при их наличии лучше использовать их.
Минусы: сложность системы, не гарантирует верный результат, есть небольшая плата при высоких нагрузках (легко окупится рекламой на сайте).
https://github.com/marciocamello/yii2-sypexgeo/
2) Определение часового пояса через JavaScript на стороне клиента.
Плюсы: просто, бесплатно.
Минусы: не найдено реализаций для Yii2, работает только при корректных настройках времени у пользователя и актуальной базы данных о часовых поясах (у меня, к примеру, для Барнаула отображаются устаревшие данные).
Я взял вот эту библиотечку:
https://github.com/barbushin/dater
и встроил в Yii2 следующим образом (если предложите вариант получше - буду благодарен):
в конфигурации:
'components' => [
'timezoneDetector' => [
'class' => 'Dater\TimezoneDetector',
]
],
'on ' . yii\base\Application::EVENT_BEFORE_REQUEST => function ($event) {
$clientTimezone = Yii::$app->timezoneDetector->getClientTimezone(); // часовой пояс пользователя
if (isset($clientTimezone)) Yii::$app->timeZone = $clientTimezone;
},
и в шаблоне layouts/main.php
< head>
...
<?= Yii::$app->timezoneDetector->getHtmlJsCode() // определение часового пояса пользователя ?>
...
< /head>
вставка в шаблон приложения дополнительного кода мне не нравится, так как хотел написать поведение для Yii2, но следующий код у меня работать не стал (пробовал на разные события цеплять)
'on ' . yii\base\Application::EVENT_AFTER_REQUEST => function ($event) {
Yii::$app->view->registerJs(Yii::$app->timezoneDetector->getHtmlJsCode(), yii\web\View::POS_HEAD);
}