简而言之,如果我不得不问这个问题只是这个链接问题的反面。
我正在使用一个 javscript 库,它会自动检测时区并以 PHP 格式(即'Europe/Berlin'
格式)返回时区名称。
但是我使用了 Codeigniters timezone_menu
,它提供了一个时区下拉框,我想知道如何将这个 php 时区(即'Europe/Berlin'
)转换为 codeigniters 时区格式,即UP1
。?
简而言之,如果我不得不问这个问题只是这个链接问题的反面。
我正在使用一个 javscript 库,它会自动检测时区并以 PHP 格式(即'Europe/Berlin'
格式)返回时区名称。
但是我使用了 Codeigniters timezone_menu
,它提供了一个时区下拉框,我想知道如何将这个 php 时区(即'Europe/Berlin'
)转换为 codeigniters 时区格式,即UP1
。?
从CodeIgniter 文档中可以看出,他们将时区视为固定偏移量。他们的约定相当简单:
UTC
准确地表示UTC。
或者
U
代表 UTC
M
或P
减号或加号
描述偏移量的数字
UP55
,但实际上UP45
那么他们为什么这样做呢?谁知道。这不是标准的东西,它是 CodeIgnitor 的特殊格式。通常,偏移量仅表示为+05:30
or +0530
。
使用偏移量来表示整个时区与现实不同步。如果就这么简单,那么我们就不需要像一开始那样的 IANA 时区Europe/Berlin
了。您可以在此处看到在 +01:00 和 +02:00 之间交替的时区列表。Europe/Berlin
Code Ignitor 可能会说它是UP1
,但那永远不会考虑到日光时间偏移。(世界各地的夏令时都不同,所以你不能只用一个复选框来增加它并期望它是可靠的。)
因此,如果您必须使用 CodeIgnitor 奇怪的时区表示形式,则采用 IANA 区域的基本偏移量并应用他们的时髦公式(如 dev-null-dweller在他的回答中所示)。只是不要指望它是准确的。
而且,如果您处于偏移量为 :45 的区域,那么您就不走运了。那将是Pacific/Chatham
或Asia/Kathmandu
。
您可以在“时区!=偏移”下的时区标签维基中阅读更多信息
只是为了给这个答案添加一些真正有建设性的东西,我建议不要使用 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