Чтобы подвести итог ответа Мэтта Джонсона в терминах кода:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){
var tz = jstz.determine(); // Determines the time zone of the browser client
var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.
$.post("url-to-function-that-handles-time-zone", {tz: timezone}, function(data) {
//Preocess the timezone in the controller function and get
//the confirmation value here. On success, refresh the page.
});
});
</script>
Информация о часовом поясе браузера не является частью спецификации HTTP, поэтому вы не можете просто получить ее из заголовка.
Если у вас есть координаты местоположения (например, с мобильного устройства GPS), то вы можете найти часовой пояс , используя один из этих методов . Тем не менее, геолокация по IP-адресу не является хорошим решением, потому что часто это IP-адрес интернет-провайдера или прокси-сервера, который может находиться в другом часовом поясе.
Есть несколько стратегий, которые вы можете использовать для определения часового пояса, например, использование библиотеки jsTimeZoneDetect , которая является отличной отправной точкой, но достаточно несовершенна, чтобы вы не могли полагаться только на нее , Если вы используете moment.js, в моментной зоне есть встроенная функция moment.tz.guess()
, которая делает то же самое.
Идея использования JavaScript-функции getTimezoneOffset()
ошибочна в том, что вы не получаете часовой пояс - только одно смещение для конкретной даты. См. раздел вики-тега TimeZone под названием «TimeZone! = Offset».
Как ни крути, в конечном итоге вам нужно выбрать один из двух подходов:
ИЛИ
Я обсуждаю это более подробно (с точки зрения c #) в этот ответ .
Зависимости:
http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
//Get remote IP
$ip = Зависимости:
SERVER['REMOTE_ADDR'];
//Open GeoIP database and query our IP
$gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD);
$record = geoip_record_by_addr($gi, $ip);
//If we for some reason didnt find data about the IP, default to a preset location.
if(!isset($record)) {
$record = new geoiprecord();
$record->latitude = 59.2;
$record->longitude = 17.8167;
$record->country_code = 'SE';
$record->region = 26;
}
//Calculate the timezone and local time
try {
//Create timezone
$user_timezone = new DateTimeZone(get_time_zone($record->country_code, ($record->region!='') ? $record->region : 0));
//Create local time
$user_localtime = new DateTime("now", $user_timezone);
$user_timezone_offset = $user_localtime->getOffset();
}
//Timezone and/or local time detection failed
catch(Exception $e) {
$user_timezone_offset = 7200;
$user_localtime = new DateTime("now");
}
echo 'User local time: ' . $user_localtime->format('H:i:s') . '<br/>';
echo 'Timezone GMT offset: ' . $user_timezone_offset . '<br/>';
Это прекрасно работает ...
echo <<<EOE
<script type="text/javascript">
if (navigator.cookieEnabled)
document.cookie = "tzo="+ (- new Date().getTimezoneOffset());
</script>
EOE;
if (!isset( Это прекрасно работает ...
[110]COOKIE['tzo'])) {
echo <<<EOE
<script type="text/javascript">
if (navigator.cookieEnabled) document.reload();
else alert("Cookies must be enabled!");
</script>
EOE;
die();
}
$ts = new DateTime('now', new DateTimeZone('GMT'));
$ts->add(DateInterval::createFromDateString( Это прекрасно работает ...
[110]COOKIE['tzo'].' minutes'));
Одно из решений - спросить их! Особенно в системах участников, где вы можете захватить / зарегистрировать пользователя - предоставьте им выбор на этом этапе. Просто, но точно.