【问题标题】:Converting IST datetime to Asia/Kolkata datetime adds 3.5 extra hours in PHP DateTime's setTimezone() procedure将 IST 日期时间转换为亚洲/加尔各答日期时间会在 PHP DateTime 的 setTimezone() 过程中增加 3.5 小时
【发布时间】:2020-08-03 00:47:20
【问题描述】:

我有一段代码

$data = array(
  'fromTimezone'          => 'IST',
  'toTimezone'            => 'Asia/Kolkata',
  'dateTime'              => '2020-04-19 16:23:00',
  'dateTimeFormat'        => 'Y-m-d H:i:s'
);

$fromTimezone           = $data['fromTimezone'];
$toTimezone             = $data['toTimezone'];
$dateTime               = $data['dateTime'];
$dateTimeFormat         = $data['dateTimeFormat'];


$fromZoneDateTime    = new DateTime($dateTime, new DateTimeZone($fromTimezone));

// synchronizing with the to-Timezone
$fromZoneDateTime->setTimezone(new DateTimeZone($toTimezone));

$returnDateTime    = date($dateTimeFormat, strtotime($fromZoneDateTime->format('Y-m-d H:i:s')));
echo $returnDateTime;

如您所见,我正在将时区从 IST 转换为亚洲/加尔各答。基本上,亚洲/加尔各答是 IST(印度标准时间),因此它们都应该有相同的时间。但我得到的结果是2020-04-19 19:53:00

我做错了什么?

编辑:-

有人可能会问我为什么需要将 IST 转换为亚洲/加尔各答。事实上,在 Laravel 应用程序中,我们的默认时区是亚洲/加尔各答。但在 mysql 查询中,我将时区设为“IST”。

SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) AS mysql_timezone;

在用户表中,用户的时区保存为从移动应用发送的“亚洲/加尔各答”、“美国/纽约”等。

在我的表格中,有一个名为created_date 的字段(不要与created_at 混淆)通过使用PHP 的date('Y-m-d H:i:s') 过程来保存当前日期时间。因此,当我尝试将其转换为用户的时区时,我将其从 IST 转换为 Asia/Kolkata。

【问题讨论】:

标签: php datetime


【解决方案1】:

根据Wikipedia Asia/Kolkata us UTC+5:30,您可以得到半小时的时差。

印度共和国使用一个时区,即印度标准时间 (IST)。这是 UTC+05:30,即比世界协调时间提前五个半小时。 ... IANA 时区数据库仅包含一个区域,即亚洲/加尔各答。

其他信息

根据the docs on PHP timezones

警告 请不要使用此处列出的任何时区(UTC 除外),它们仅出于向后兼容的原因而存在,并且可能会暴露错误行为。

警告 如果您忽略上述警告,还请注意,提供 PHP 时区支持的 IANA 时区数据库使用 POSIX 样式标志,这会导致 Etc/GMT+n 和 Etc/GMT-n 时区与常用时区相反。

例如,中国和西澳大利亚(以及其他地方)使用的比格林威治标准时间早 8 小时的时区在此数据库中实际上是 Etc/GMT-8,而不是您通常期望的 Etc/GMT+8。

再次强烈建议您使用适合您所在位置的正确时区,例如上述示例中的亚洲/上海或澳大利亚/珀斯。

【讨论】:

  • 但是列表中根本没有IST。 Asia/Kolkata 是一个有效的时区,也在 Laravel 中列出。此外,当我将时区从亚洲/加尔各答转换为 GMT+5:30 时,我得到了正确的时区数据。所以我认为问题在于 IST 的概念。但是,为什么 PHP 没有显示任何错误?
  • 是的,我只是提供了附加信息作为参考。亚洲/加尔各答是一个有效的时区,无需转换为 IST,因为它们是相同的。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 2020-10-28
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多