【问题标题】:PHP - set default timezone offset for areas without timezone name (sea locations)PHP - 为没有时区名称的区域(海上位置)设置默认时区偏移量
【发布时间】:2020-03-09 11:03:19
【问题描述】:

我正在编写使用时区的 PHP 应用程序。对于陆基 GPS,我使用

date_default_timezone_set();

使用正确的名称,例如 Europe/Dublin。但是,如果 GPS 位置不是陆地而是在海上,则没有时区名称,但时间与 UTC 有偏移。计算是近似的。经度 15 度为 1 小时。我已经手动计算了 UTC 偏移量,但我无法将其设置为 PHP。我正在使用 date 方法从 unix 时间戳打印人类可读的日期。

我发现还有其他时区名称 (https://www.php.net/manual/en/timezones.others.php),例如 Etc/GMT+10,但 PHP 文档指出:

警告请不要使用此处列出的任何时区(UTC 除外),它们 仅出于向后兼容的原因而存在,并且可能会暴露错误 行为。

使用基于Etc 的偏移量是否安全?或者有没有其他安全的解决方案?我还没有找到。在date_default_timezone_set() cmets 有人“使用”这个:https://www.php.net/manual/en/function.date-default-timezone-set.php#96551 但它看起来很丑。

我使用的是 PHP 7.1。

【问题讨论】:

    标签: php datetime timezone timezone-offset


    【解决方案1】:

    PHP 中的时区源自IANA tz database

    特别是,像 Etc/GMT+10 这样的区域源自 tz 数据中的 etcetera 文件,which says(强调我的):

    ... 这些天来, tz 文件几乎涵盖了所有有人居住的世界,唯一实用的 现在需要的条目不是 UTC 是针对海上船只的 不能使用 POSIX TZ 设置。

    因此,您确实可以并且应该将它们用于您描述的目的。

    请记住,它们仅存在于从 Etc/GMT-14Etc/GMT+12 的整小时偏移,并且区域名称中的符号与标准约定相反。换句话说,Etc/GMT+10 实际上是 UTC-10。

    另一个注释。我的理解是,海上的船舶在靠近陆地的领海内使用陆地时区是很常见的,包括任何有效的夏令时调整。例如,一艘在美国领海内沿太平洋沿岸航行的船舶应将其时钟更改为在冬季使用 PST (UTC-8) 并在夏季使用 PDT (UTC-7)。这是由America/Los_Angeles 建模的,而纯纵向计算将全年使用UTC-8 (Etc/GMT+8)。

    所有这些都是灵活的,因为船长基本上可以自行决定上船时间。有关详细信息,请参阅 Wikipedia 在 nautical time 上的文章。

    您可能还想read here 了解使用 GPS 坐标解析 IANA 时区的方法。那些使用Time Zone Boundary Builder 项目作为数据源(例如the Geo-Timezone PHP library)的人受益于考虑到航海时间和领海。

    【讨论】:

    • 感谢您的详细解答。
    猜你喜欢
    • 2011-06-11
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2014-03-27
    • 2018-03-01
    相关资源
    最近更新 更多