简而言之,如果我不得不问这个问题,这只是这个链接问题的反面。
我正在使用一个 javscript 库,它会自动检测时区并以 PHP 格式(即'Europe/Berlin'
格式)返回时区名称。
但是我使用 Codeigniters timezone_menu
它给出了一个时区的下拉框,我想知道如何将此 php 时区(即 'Europe/Berlin'
)转换为编码点火器时区格式,即UP1
.?
从CodeIgniter文档中可以看出,他们将时区视为固定偏移量。 他们的约定相当简单:
-
UTC
准确地表示 UTC。或
-
U
表示 UTC -
减号或加号为
M
或P
-
描述偏移量的数字
- 整小时偏移量为个位数
- 当有半小时偏移时,两位数,但这些偏移时髦(你会认为 +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/Chatham
或Asia/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