【问题标题】:How to set php timezone by offset value in hh:mm, minuts or seconds?如何通过hh:mm,分钟或秒的偏移值设置php时区?
【发布时间】:2020-03-13 19:20:05
【问题描述】:

我的在线应用程序以分钟为单位获取+- 值中的用户时区偏移量。我想在服务器中设置这个值。
MySQL / MariaDB 接受时区值并完美运行

SET time_zone = "+0:15";

但是php只接受这样的时区字符串

date_default_timezone_set("Asia/Karachi"); // Works Perfectly

并且没有在偏移值中设置时间

date_default_timezone_set("+0:15"); // Error

有没有办法用偏移值设置php时间?

【问题讨论】:

  • 你为什么要这么做?

标签: php timezone timezone-offset


【解决方案1】:

阅读 date_default_timezone_set() php 函数的文档后,这似乎是一个常见问题。

我确信如果您选择在 php 中使用其他日期函数,可能会有其他选择,但是,为了能够通过偏移量设置时区,您需要一个辅助函数来执行此操作。

我已经复制并修改了一个发布在 php 文档页面 here 上的辅助函数

function setTimezoneByOffset($offset)
{
  $testTimestamp = time();
    date_default_timezone_set('UTC');
    $testLocaltime = localtime($testTimestamp,true);
    $testHour = $testLocaltime['tm_hour'];       


$abbrarray = timezone_abbreviations_list();
foreach ($abbrarray as $abbr)
{
    //$abbr."<br>";
  foreach ($abbr as $city)
  {
            date_default_timezone_set($city['timezone_id']);
            $testLocaltime     = localtime($testTimestamp,true);
            $hour                     = $testLocaltime['tm_hour'];       
            $testOffset =  $hour - $testHour;
            if($testOffset == $offset)
            {

                return $city['timezone_id'];
            }
  }
}
return false;
}

其中参数 $offset 是偏移量的字符串表示形式(即'+0:15'),它返回与您的输入匹配的时区的时区 id。

【讨论】:

  • 应该避免这种方法。它所做的只是返回当前使用给定偏移量的第一个时区。根据代码运行的时间,它可能会返回截然不同的结果,并忽略 DST 和其他时区转换的所有现实情况。
【解决方案2】:

我的在线应用程序以分钟为单位获取用户时区偏移量的 + 或 - 值。

这是有问题的,因为时区偏移与时区不同。考虑到不能采用 current 偏移量并假设它是适用于任何给定日期和时间的正确偏移量。许多时区根据一年中的时间使用多个偏移量,并且许多时区在历史的不同点对其标准时间偏移量进行了更改。有关这方面的更多信息,请参阅the timezone tag wiki 中的“时区!= 偏移量”。

例如,您可能正在使用像 new Date().getTimezoneOffset() 这样的 JavaScript 函数。但是,这会返回 new Date() 返回的 Date 对象的偏移量 - 这是 当前 日期。对我来说,在美国太平洋时区,它会在标准时间的冬季运行时返回 480 (UTC-8),但在夏季夏令时运行时返回 420 (UTC-7)。

相反,让您的前端调用 Intl.DateTimeFormat().resolvedOptions().timeZone 在 JavaScript 中返回时区标识符,对我来说返回 "America/Los_Angeles"。您可以将其传递给您的后端并与 PHP 一起使用。

附带说明,世界上没有使用或曾经使用 UTC+0:15 的时区。最接近的应该是 1909 年 5 月 1 日至 1940 年 5 月 16 日在荷兰使用的 UTC+0:20。这已经记录在 "Europe/Amsterdam" 的历史中。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2017-07-03
    • 2018-06-29
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多