我有一段代码
$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转换为亚洲/加尔各答。
根据维基百科亚洲/加尔各答我们UTC+5:30,这是你得到半小时时差的地方。
印度共和国使用一个时区,即印度标准时间(IST(。现在是UTC+05:30,也就是说,比协调世界时提前了五个半小时。。。IANA时区数据库只包含一个区域,即亚洲/加尔各答。
附加信息
根据PHP时区的文档:
警告请不要使用此处列出的任何时区(UTC除外(,这些时区的存在只是出于向后兼容的原因,可能会暴露错误行为。
警告如果您忽略上述警告,还请注意,提供PHP时区支持的IANA时区数据库使用POSIX样式的符号,这会导致Etc/GMT+n和Etc/GMT-n时区从常见用法中颠倒过来。
例如,在中国和西澳大利亚(以及其他地方(使用的格林尼治标准时间前8小时的时区实际上是该数据库中的Etc/GMT-8,而不是您通常预期的Etc/GMT+8。
同样,强烈建议您使用正确的时区,例如亚洲/上海或澳大利亚/珀斯。