PHP 使用 date() 自定义偏移量的默认时区(或日期)
PHP Default Timezone (or Date) with Custom Offset Using date()
在PHP中,我正在使用date_default_timezone_set
设置默认时区。
然后,每当我使用 date('m/d/y g:i A')
时,无论客户端位于何处,它都会为我提供该时区的正确时间。
但是,我需要能够在页面加载时设置 用户定义的默认时区偏移量 ,以分钟为单位设置。所以它可以是从 -99999 到 0 到 99999 的任何值。
我不知道如何将偏移量与默认时区设置相结合。
我看过很多关于如何使用 UTC 和 GMT 偏移量的信息,但没有关于自定义默认时区偏移量的信息(以分钟或秒为单位)。
我希望有人对此有一些经验,可以为我指明正确的方向。
显然,如果不定义自定义日期包装器并每次都获取和分配偏移量,PHP 这是不可能的。
除了我之外还有没有人认为这应该包含在PHP中,比如..
date_default_timezone_set($timezone, $optionalCustomOffset);
我要提交 RFC
非常感谢任何帮助。
谢谢
宠物0
-new Date().getTimezoneOffset()/60;
getTimezoneOffset()
将从格林威治标准时间减去您的时间,return 分钟数。因此,如果您住在 GMT-8,它将 return 480。将其转换为小时,除以 60。另外,请注意符号与您需要的符号相反——它计算的是 GMT 与您的时间的偏移量时区,而不是您的时区与格林威治标准时间的偏移量。要解决此问题,只需乘以 -1.
就地理定位而言,我已经在多个项目中使用了 MaxMind GeoIP,并且效果很好,但我不确定它们是否提供时区数据。这是一项您付费的服务,他们会每月更新您的数据库。他们提供多种网络语言的包装器。
更新
好吧,在我测试这个之后,如果它有效,我认为这将等同于我正在寻找的答案,所以我必须将我自己的答案标记为正确,除非有人站出来告诉我...... .
(NOTE: rename and override functions require that PECL APD be
installed.)
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);
}
在PHP中,我正在使用date_default_timezone_set
设置默认时区。
然后,每当我使用 date('m/d/y g:i A')
时,无论客户端位于何处,它都会为我提供该时区的正确时间。
但是,我需要能够在页面加载时设置 用户定义的默认时区偏移量 ,以分钟为单位设置。所以它可以是从 -99999 到 0 到 99999 的任何值。
我不知道如何将偏移量与默认时区设置相结合。
我看过很多关于如何使用 UTC 和 GMT 偏移量的信息,但没有关于自定义默认时区偏移量的信息(以分钟或秒为单位)。
我希望有人对此有一些经验,可以为我指明正确的方向。
显然,如果不定义自定义日期包装器并每次都获取和分配偏移量,PHP 这是不可能的。
除了我之外还有没有人认为这应该包含在PHP中,比如..
date_default_timezone_set($timezone, $optionalCustomOffset);
我要提交 RFC
非常感谢任何帮助。
谢谢
宠物0
-new Date().getTimezoneOffset()/60;
getTimezoneOffset()
将从格林威治标准时间减去您的时间,return 分钟数。因此,如果您住在 GMT-8,它将 return 480。将其转换为小时,除以 60。另外,请注意符号与您需要的符号相反——它计算的是 GMT 与您的时间的偏移量时区,而不是您的时区与格林威治标准时间的偏移量。要解决此问题,只需乘以 -1.
就地理定位而言,我已经在多个项目中使用了 MaxMind GeoIP,并且效果很好,但我不确定它们是否提供时区数据。这是一项您付费的服务,他们会每月更新您的数据库。他们提供多种网络语言的包装器。
更新
好吧,在我测试这个之后,如果它有效,我认为这将等同于我正在寻找的答案,所以我必须将我自己的答案标记为正确,除非有人站出来告诉我...... .
(NOTE: rename and override functions require that PECL APD be installed.)
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);
}