如何将PHP时区字符串(例如Europe / Berlin)转换为codeigniter时区(例如UP1)

时间:2013-09-08 20:59:56

标签: php codeigniter datetime timezone

如果我不得不问这个问题是just the vice verse of this link question

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

但是我使用了Codeigniters timezone_menu,它提供了drop down box个时区,我想知道如何将这个php时区(即'Europe/Berlin')转换为codeigniters时区格式,即UP1。?

2 个答案:

答案 0 :(得分:1)

the CodeIgniter documentation看来,它们将时区视为固定偏移。他们的惯例非常直接:

  • UTC代表完全 UTC。

  • U代表UTC

  • 对于减号或加号
  • MP

  • 描述偏移的数字

    • 整个小时偏移的单个数字
    • 有半小时偏移的两位数字,但这些数字被移动了(你会认为+05:30会被UP55表示,但它实际上是UP45

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

使用偏移来表示整个时区与现实不同步。如果这很容易,那么我们首先不需要像Europe/Berlin这样的IANA时区。您可以看到in the time zone list here Europe/Berlin在+01:00和+02:00之间交替显示。 Code Ignitor可能会说它是UP1,但那时不会考虑日光时间偏移。 (夏令时在全世界都是不同的,所以你不能只用一个复选框来增加它,并期望它是可靠的。)

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

如果你的区域有:45偏移,那么你运气不好。那将是Pacific/ChathamAsia/Kathmandu

您可以在“时区!=偏移”

下的the timezone tag wiki中阅读更多内容

为了向这个答案添加一些实际上具有建设性的东西,我建议不要使用CodeIgnitor的时区。坚持使用IANA区as provided for you by PHP。它们甚至通过timezondb in the PECL保持最新。

答案 1 :(得分:0)

我不太了解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