如何使用jquery获取用户时区?

时间:2011-11-11 06:47:06

标签: php jquery timezone

我想用'亚洲/加尔各答''澳大利亚/达尔文'

等名称获取他们的时区

我在myserver上安装了php,其时间设置为'UTC'

6 个答案:

答案 0 :(得分:13)

这是我在这里的第一篇文章,但希望我可以帮助别人。我感到被迫,因为这个网站对我帮助很大。谢谢stackoverflow成员!

http://www.pageloom.com/automatic-timezone-detection-with-javascript

根据我对此JavaScript代码的理解,它非常准确,并且能够从UST返回偏移量,相应的Olson数据库时区名称,并处理夏令时问题(例如-5:00,America / New_york,true)。

http://www.php.net/manual/en/timezones.america.php

上面的链接只是php支持的时区参数的列表,据我所知,这个JavaScript代码对齐(我确信这是有益的我只是不知道为什么我还在编写我的代码我是php / mysql的新手。)

在你的html页面上运行这些代码之后,你将面临的唯一障碍可能是将这些值传递给php,然后将其传递给mysql,如果这是你需要的。我通过使用JQuery将这些值作为$ .post发送来实现这一点。我认为这是最简单的方法(如果我错了,请有人纠正我)。我相信其他选择使用AJAX命令(更复杂)或cookie(我认为?)。

在我从Java脚本代码到服务器(PHP)的值之后,我将它们存储为会话变量,这样如果我站点上的用户从通常的不同时区登录,它们就会改变。但是,它们也可以很容易地保存到数据库中。

如果您使用JQuery路由,则需要在正在执行$ .post的html文档的标题中。

 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>

可以在我发布的第一个网址上找到最新的timezonedetect脚本。

//replace this comment with the most updated timezonedetect code from that first link
var timezone = jstz.determine_timezone();
var tzoffset = timezone.offset();
var tzname = timezone.name();
var tzdst = timezone.dst();
$.post("scripts/tzdetect.php", { tzoffset: tzoffset, tzname: tzname, tzdst: tzdst } );

如果您希望将数据存储为会话变量,则tzdetect.php中的接收文件应该如下所示。

<?php
session_start();
$_SESSION['tzname'] = $_POST['tzname'];
$_SESSION['tzoffset'] = $_POST['tzoffset'];
$_SESSION['tzdst'] = $_POST['tzdst'];
?>

答案 1 :(得分:11)

要检测时区偏移,您可以使用此功能:

function get_time_zone_offset( ) {
  var current_date = new Date();
  return parseInt(-current_date.getTimezoneOffset() / 60);
}

示例您可以看到here

答案 2 :(得分:3)

您的问题实际上是关于Javascript而不是PHP - 因为它取决于客户端功能。

据我所知,Javascript允许您确定当前时区偏移(UTC与本地时间之间的差异),但允许您明确地确定时区。许多时区在任何一个特定时间点都会共享相同的偏移量,但在其他时间会有所不同,就是他们是否观察到夏令时以及他们在什么时候进入和避开夏令时而言。

如果您确实需要时区,则可能需要制定一个可能的时区列表,并将其呈现给用户 - 同时允许他们覆盖缩小决策,选择任何时区。

同样,这实际上取决于你想要实现的目标。

答案 3 :(得分:3)

您不需要jQuery来执行此操作。请尝试以下代码:

var offset = (new Date()).getTimezoneOffset();
alert(offset);

它会提醒当前时区偏离浏览器(以分钟为单位)。

请参阅this jsfiddle as a proof

我认为您需要自己将其转换为时区名称。如果您希望名称保持一致,则不应依赖用户的浏览器。

您可以使用此代码(请参阅this jsfiddle):

var offset = (new Date()).getTimezoneOffset();

var timezones = {
    '-12': 'Pacific/Kwajalein',
    '-11': 'Pacific/Samoa',
    '-10': 'Pacific/Honolulu',
    '-9': 'America/Juneau',
    '-8': 'America/Los_Angeles',
    '-7': 'America/Denver',
    '-6': 'America/Mexico_City',
    '-5': 'America/New_York',
    '-4': 'America/Caracas',
    '-3.5': 'America/St_Johns',
    '-3': 'America/Argentina/Buenos_Aires',
    '-2': 'Atlantic/Azores',
    '-1': 'Atlantic/Azores',
    '0': 'Europe/London',
    '1': 'Europe/Paris',
    '2': 'Europe/Helsinki',
    '3': 'Europe/Moscow',
    '3.5': 'Asia/Tehran',
    '4': 'Asia/Baku',
    '4.5': 'Asia/Kabul',
    '5': 'Asia/Karachi',
    '5.5': 'Asia/Calcutta',
    '6': 'Asia/Colombo',
    '7': 'Asia/Bangkok',
    '8': 'Asia/Singapore',
    '9': 'Asia/Tokyo',
    '9.5': 'Australia/Darwin',
    '10': 'Pacific/Guam',
    '11': 'Asia/Magadan',
    '12': 'Asia/Kamchatka' 
};

alert(timezones[-offset / 60]);

但是我不会太依赖它。

答案 4 :(得分:0)

您可以获得timezone offset。您可以使用它来计算大致时区。您可以保留时区偏移和names的关联列表。 但是,此方法不会给出任何确切的值。

答案 5 :(得分:-1)

<?
echo date("e");
?>

这将给出输出:

亚/加尔各答