【问题标题】:PHP Default Timezone (or Date) with Custom Offset Using date()PHP默认时区(或日期)与自定义偏移使用日期()
【发布时间】:2015-05-07 15:13:25
【问题描述】:

PHP 我使用date_default_timezone_set 来设置默认时区。

然后,每当我使用 date('m/d/y g:i A') 时,它都会为我提供该时区的正确时间,而不管客户的位置如何。

但是,当页面加载时,我需要能够设置 用户定义的默认时区偏移量,以分钟为单位。所以它可以是从 -99999 到 0 到 99999 的任何值。

我不知道如何将偏移量与默认时区设置相结合。

我已经看到了大量关于如何使用 UTCGMT 偏移量的信息,但没有关于自定义默认时区偏移量(以分钟或秒为单位)的信息。

我希望有人对此有一些经验,可以为我指明正确的方向。

如果不定义自定义日期包装器并每次都获取和分配偏移量,使用 PHP 显然这是不可能的。

除了我之外还有其他人认为这应该包含在 PHP 中吗..

date_default_timezone_set($timezone, $optionalCustomOffset);

我要提交一个 RFC

非常感谢任何帮助。

谢谢

宠物0

【问题讨论】:

  • 您的用户将如何定义/设置时区?他们什么时候登录?数据库中的配置?以某种方式检测浏览器设置?您可以使用php.net/manual/en/function.date-default-timezone-set.php date_default_timezone_set() 动态更改时区设置。该链接将链接到您可以使用的可接受时区字符串列表。
  • 我已经阅读了该页面。时区存储在一个文件中,可以通过 PHP 或 JS(通过 ajax)轻松检索。有没有办法使用 date_default_timezone_set 设置不是以小时为单位的时区默认偏移量,而不是 GMT 或 UTC 偏移量?如果有请发布答案,因为我无法弄清楚。
  • 我认为除了以小时为单位之外没有其他方法可以设置时区(或偶尔的官方时区 30 分钟)。如果您想以非标准方式以分钟为单位计算新的日期偏移量,您可能必须将您的时间转换为 unix 时间戳(自纪元以来的秒数),并在生成日期字符串以供输出之前始终添加/减去偏移量。如果这是您想要的,请告诉我,我会提供更多详细信息。
  • 我看到了一个看起来可以使用 DateTime 的解决方案,但是将其完全重新编码到站点中需要很长时间。所以我现在只是创建一个函数来包装 PHP 日期函数并添加偏移量。如果有人对此提供了答案,我仍然会将其标记为正确。
  • @fbas 你能改进我在下面作为答案发布的日期函数包装器吗?

标签: php date timezone offset overriding


【解决方案1】:
-new Date().getTimezoneOffset()/60;

getTimezoneOffset() 将从 GMT 中减去您的时间并返回分钟数。因此,如果您居住在 GMT-8 中,它将返回 480。将其转换为小时,除以 60。另外,请注意符号与您需要的相反——它计算的是 GMT 与您的时区的偏移量,而不是您的时区时区与 GMT 的偏移量。要解决此问题,只需乘以 -1。

就地理位置而言,我在几个项目中使用了 MaxMind GeoIP,并且效果很好,但我不确定它们是否提供时区数据。这是一项您付费的服务,他们会为您的数据库提供每月更新。它们提供多种网络语言的包装器。

【讨论】:

  • 您好,感谢您的回答,但我不确定您是否理解我的问题。请再次阅读我的问题。我希望将默认时区设置为以分钟为单位的偏移值。无需将时区偏移量与 GMT 或 UTC 进行比较(正如我在问题中所说)。我已经设置了默认时区。我只需要为默认时区定义一个自定义偏移量。
【解决方案2】:

更新

好吧,在我测试这个之后,如果它有效,我认为这将等同于我正在寻找的答案,所以我必须将我自己的答案标记为正确,除非有人会站出来告诉我......

(注意:重命名和覆盖函数要求 PECL APD 是 已安装。)

if (function_exist('__overridden__')) 
    { rename_function('__overridden__', 'dummy-override'); }
rename_function('date', 'date-native');
override_function('date', '$s ="l, F jS, Y, g:i:s A", $t = null', 'return izDate($s ="l, F jS, Y, g:i:s A", $t = null);');
rename_function("__overridden__", 'date-override');  
function izDate($s = 'l, F jS, Y, g:i:s A', $t = null) {
    $file = ('../timezone.config');
    $f = file_get_contents($file);
    $offset = getTzValue($f, 'offset');
    $time = $t === null ? time() : $t;
    $time += $offset ? (int) $offset : 0;
    return date-native($s, $time);
}

结束更新

我没有太多时间等待这个问题的答案,所以我就是这样解决的。如果有人有更好的解决方案,或者甚至可以帮助我为此编写更好的包装器,我会打勾。

      function izDate($s, $t=null) {
          $file = ('../timezone.config');
          $f = file_get_contents($file);
          $offset = getTzValue($f, 'offset');
          $time = $t===null ? time() : $t;
          $time += $offset ? (int) $offset : 0;
          return date($s, $time);
      }

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2012-12-07
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多