【问题标题】:PHP Timezone Conversion from "IST GMT+5:30" to something like Asia/KolkataPHP 时区从“IST GMT+5:30”转换为 Asia/Kolkata
【发布时间】:2014-06-07 01:02:48
【问题描述】:

我有一个字符串,如“IST GMT+5:30”,我想将其转换为“亚洲/加尔各答”或任何印度时区。

我正在尝试的是

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

当 $userSubmittedTimezoneString='IST' 时,输出如下:

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

'Asia/Jerusalem' 是 以色列时区,但我想要的是 印度标准时间

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

编辑:

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

【问题讨论】:

  • 我不知道是否有专门针对印度的独特解决方案,但总的来说这几乎是不可能的。可能有任意数量的具体时区映射到相同的 GMT 偏移量,即使有国家限制。
  • @deceze : 实际上 "IST GMT+5:30" 可以是任何与时区相似的东西,相似但不完全相同,这就是问题所在。
  • @ParagTyagi:答案在哪里?
  • 所以基本没有解决办法。您不能将 GMT 偏移量唯一地转换为时区。也许只有像“IST”这样的短格式可以被转换。您可以获得哪些可能的输入?

标签: php date timezone


【解决方案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 日和 7 月 1 日) .

总而言之:不存在这样的“转换”,但考虑到一些警告,有根据的猜测当然是可能的。

【讨论】:

  • 抱歉回复晚了,这个回答还算满意。 +1 这个答案:)
猜你喜欢
  • 2020-09-22
  • 1970-01-01
  • 2012-10-24
  • 2012-12-25
  • 2021-04-26
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多