【问题标题】:How to allow a user to change timezone, but stay on the same page如何允许用户更改时区,但保持在同一页面上
【发布时间】:2013-11-25 21:21:12
【问题描述】:

基本上,我需要用户能够更改时区,但将它们保持在同一页面上。这样做的原因是,我使用的是 jQuery/ajax 页面加载器脚本,当我使用 form/php 时,我目前拥有它只是转到实际的 php 文件(php 文件工作正常)。我只需要它留在页面上。

这是页面的代码:

<?php
date_default_timezone_set($_POST['timezones']);
?>

<form action="data4.php" method="post">
<select name="timezones">
  <option>Select your timezone</option>
  <option value="Europe/London">Europe/London</option>
  <option value="America/Mexico_City">Central</option>
  <option value="America/New_York">Eastern</option>
</select>
<input type="submit" value="Submit" />
</form>

我确实计划添加更多时区,这只是为了演示。

如果有人有一些有用的信息/帮助,我将非常感激。

【问题讨论】:

  • 看看momentjs.com
  • 你想在这里详细做什么?在 PHP 中设置 date_default_timezone_set() 时,它只是为了那个请求,除了显示时区之外什么都没有。如果您尝试通过 JS 设置它(没有页面加载)并在您的 PHP 代码中使用它,也许您应该在 cookie 中执行它...

标签: php jquery ajax timezone


【解决方案1】:

这是一种方法。

<!doctype html>
<html>
    <head>
<?php
        session_start();
        if(!isset($_SESSION['timezone'])) {
            if(!isset($_REQUEST['offset'])) {
?>

        <script type="text/javascript">
            var d = new Date()
            var offset= -d.getTimezoneOffset()/60;
            location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
        </script>
<?php
            } else {
                $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
                $index = array_keys($zonelist, $_REQUEST['offset']);
                $_SESSION['timezone'] = $index[0];
            }
        }
        date_default_timezone_set($_SESSION['timezone']);
?>

    </head>
    <body>
        Current Time Zone is <?php echo $_SESSION['timezone']; ?>
    </body>
</html>

基本上它的工作原理非常简单,你可以让这个脚本成为你的页面做的第一件事,因为时区将保留在会话中。

从 session_start() 开始;它将首先检查 SESSION 中是否有时区变量,如果没有,它将检查 REQUEST 和偏移变量。如果不是,它将使用 JavaScript 并使用它从浏览器检测到的正确时区重新加载页面,方法是使用 $_GET 方法检查偏移量(将返回 -12 到 +12)并与数组匹配。最后,它将默认 date_time_zone 设置为检测到的 JavaScript 和您的所有设置。你可以让它显示时区。

希望有帮助

【讨论】:

  • 实际上,我收回了这一点。它对我来说很好,但对于其他用户,它将他们重定向到不存在的东西。我不确定到底发生了什么,我很困惑。它应该是habbolicious.com/v2/#!/Events,但它将它们链接到habbolicious.com/v2/load_page.php?offset=-6
  • 这来自 只需将其更改为您希望加载的页面,如下所示: location.href = "www.habbolicious.com/v2/#!/Events/{page name here}?offset="+offset;
  • 我试过了,但 events.php 是它自己的文件。我在导航时使用 ajax 脚本来包含其他 php 文件。它基本上删除了文件的 .php 并将其包含在内容中。实际的 php 文件在导航到它时工作正常,但如果我在主站点上查看它,就像它意味着要查看它一样,它就不起作用。它适用于我而不适用于其他用户,因为我查看了实际的 php 文件,然后在主站点上尝试了它,我猜会话已经开始,所以它不必重新开始。
  • 这不是一个很好的方法。将时区名称与偏移量相关联需要特定的日期和时间。这可以在您的var d = new Date() 中找到,因此您在浏览器中获得了 current 偏移量,但随后您将其与 中的 fixed 偏移量相关联$区域列表。所以这是假设偏移量永远不会改变 - 他们会这样做,因为许多时区都有夏令时。您还假设给定偏移量只有一个时区,这也是错误的。您可能想参考timezone tag wiki
  • @Matt - 虽然您对 DST 更改的看法是正确的,但由于是从浏览器调用日期,因此如果计算机已更新,它将获取 DST。现在有 99.9% 的人这样做。至于阵列,那只是我做的一个快速模型。只要您知道时区,即使使用 PHP,也可以相当容易地计算 DST。
【解决方案2】:

一种方法是 - 您可以触发 ajax 请求,当更改时区时,后端时区将被更改。但是,如果需要在同一页面中的某个时间进行更改,则还需要使用 ajax 刷新该部分。

在下拉列表中添加一个类,名称为change_time_zone_trigger

<select name="timezones" class="change_time_zone_trigger">
<option>Select your timezone</option>
<option value="Europe/London">Europe/London</option>
<option value="America/Mexico_City">Central</option>
<option value="America/New_York">Eastern</option>
</select>

然后当 evner 点击任何时区时创建一个触发器。

$(document).ready(function() {
  $('body').delegate('.change_time_zone_trigger', 'change', function(evt) {
    // here put your ajax code that will hit the server when ever any timezone will be changed.

  });

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2012-02-10
    • 2019-04-02
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多