如何将PHP时区字符串(例如欧洲/柏林)转换为代码点火器时区(例如UP1)


how to convert PHP timezone string(e.g Europe/Berlin) to codeigniter timezone(e.g. UP1)

简而言之,如果我不得不问这个问题,这只是这个链接问题的反面。

我正在使用一个 javscript 库,它会自动检测时区并以 PHP 格式(即'Europe/Berlin'格式)返回时区名称。

但是我使用 Codeigniters timezone_menu它给出了一个时区的下拉框,我想知道如何将此 php 时区(即 'Europe/Berlin' )转换为编码点火器时区格式,即UP1.?

从CodeIgniter文档中可以看出,他们将时区视为固定偏移量。 他们的约定相当简单:

  • UTC准确地表示 UTC。

  • U表示 UTC

  • 减号或加号为 MP

  • 描述偏移量的数字

    • 整小时偏移量为个位数
    • 当有半小时偏移时,两位数,但这些偏移时髦(你会认为 +05:30 会用 UP55 表示,但它实际上是UP45

那么他们为什么要这样做呢? 谁知道呢。 这不是一个标准的东西,它是一个CodeIgnitor的特殊格式。 通常,偏移量仅表示为 +05:30+0530

使用偏移量来表示整个时区与现实不同步。 如果这么简单,那么我们一开始就不需要像Europe/Berlin这样的 IANA 时区。 您可以在此处的时区列表中看到Europe/Berlin在 +01:00 和 +02:00 之间交替。 代码点火器可能会说它是UP1,但这永远不会考虑日光偏移量。 (世界各地的夏令时各不相同,因此您不能只用复选框来增加它并期望它是可靠的。

因此,如果您必须拥有CodeIgnitor的奇怪时区表示形式,那么请采用IANA区域的基本偏移量并应用其时髦的公式(如dev-null-dweller在他的答案中所显示的那样)。 只是不要指望它是准确的。

如果你在偏移量为 :45 的区域,那么你就不走运了。 那将是Pacific/ChathamAsia/Kathmandu.

您可以在时区标签wiki的"时区!=偏移量"下阅读更多信息

只是为了给这个答案添加一些真正建设性的东西,我建议不要使用CodeIgnitor的时区。 只需坚持使用 PHP 为您提供的 IANA 区域即可。 它们甚至通过PECL中的timezondb保持最新状态。

我不太

了解 CI,但从快速查看日期助手文档来看,它似乎可以从偏移量创建:

$now = new DateTime('now', new DateTimeZone('UTC'));
$tz = new DateTimeZone('America/Argentina/Buenos_Aires');
$offset = $tz->getOffset($now) / 3600;
$ci_tz = 'U';
if($offset) {
    if($offset < 0) {
        $ci_tz .= 'M';
        $offset = abs($offset);
    } else {
        $ci_tz .= 'P';
    }
    if(is_float($offset)) {
        $offset = $offset * 10 - 10;
    }
    $ci_tz .= (string)$offset;
} else {
    $ci_tz .= 'TC';
}
var_dump($ci_tz); // UM3 = UTC Minus 3 hours