PHP时区转换自" IST GMT + 5:30"像亚洲/加尔各答

时间:2014-04-22 15:02:19

标签: php date timezone

我有一个像#34; IST GMT + 5:30"我想把它转换成类似亚洲/加尔各答的东西。或任何印度时区。

我在尝试的是

$userSubmittedTimezoneString='IST';
$userTimezone = new DateTimeZone($userSubmittedTimezoneString);
print_r($userTimezone);

当$ userSubmittedTimezoneString =' IST'时,它会提供以下输出:

DateTimeZone Object ( [timezone_type] => 3 [timezone] => Asia/Jerusalem )

'亚/耶路撒冷'是一个以色列时区,但我想要的是印度标准时间

请帮助我使用php实现这一目标。

编辑:

" IST GMT + 5:30"是动态的。它来自数据库。

1 个答案:

答案 0 :(得分:1)

由于时区缩写不是唯一的,也没有时区偏移,因此没有完全可靠且无法在所有情况下都能使用的解决方案

例如,在这种情况下,时区Asia/ColomboAsia/Kolkata将匹配您的偏移和缩写。其他情况更糟糕;例如CET +01:00涵盖了欧洲和非洲的50多个时区标识符。

如果您不知道缩写和偏移所指的日期时间,那么您还有另一个问题:DST。例如,如果您知道它适用于英国夏令时的日期,则您只能匹配BST +01:00

但是,如果您接受上述问题,那么您可以猜测时区:

function findTimezone($offset, $date = 'now', $countries = \DateTimeZone::ALL) {
    foreach (\DateTimeZone::listIdentifiers($countries) as $timezone) {
        $datetime = new \DateTime($date, new \DateTimeZone($timezone));

        // find a timezone matching the offset and abbreviation
        if ($offset == $datetime->format('T P')) {
            return $timezone;
        }
    }
}

var_dump(findTimezone('IST +05:30', '2014-04-22 00:00:00'));

返回与给定缩写和偏移匹配的第一个时区。

如果您还没有使用偏移量存储日期时间,那么上述情况可能会在某些情况下给出正确的结果,但您可能需要在找到匹配项之前尝试多个日期(例如1月1日和1日) 7月)。

总结:没有这样的"转换"存在,但有一些警告肯定是可能的,但有一些警告。