我有这个功能,用于将请求日期转换为GMT00 unix时间跨度,并将该时间跨度存储到数据库中。
当我尝试将GMT00时间跨度转换为GMT + 4:00之类的有效GMT时区时,则函数返回错误的时间范围
/** * Convert date time from one timezone to another timezone * * @param $datetime (string): Date Time value which needs to be converted * @param $is_timestamp (boolean): If $datetime is a timestamp then true, otherwise false * @param $stimezone (string): Timezone from which to convert date and time * @param $dtimezone (string): Timezone in which to convert date and time * @param $format (string): Format in which you need date and time * * @return (misc) Converted date time string, null on failure */
public static function convertDateTime($datetime, $is_timestamp = false, $stimezone = "GMT+00:00", $dtimezone = "GMT+00:00", $format = null) {
if ($is_timestamp) {
$datetime = date("Y-m-d H:i:s", $datetime);
} else {
$datetime = date("Y-m-d H:i:s", strtotime($datetime));
}
try {
$date = new \DateTime($datetime, new \DateTimeZone($stimezone));
$date->setTimezone(new \DateTimeZone($dtimezone));
if (!empty($format)) {
//return $date->format($format);
return gmdate($format, $date->getTimestamp());
} else {
return $date->getTimestamp();
}
} catch (\Exception $e) {
return null;
}
}
答案 0 :(得分:0)
这里的问题是:$date->getTimestamp()
时间戳不带时区。 unix时间戳是自1970年1月1日午夜UTC以来所花费的秒数。 无论时区如何都是一样的。所以当你使用$date
时,你会失去' return gmdate($format, $date->getTimestamp());
对象的时区metada。
因此,您可以通过修改
来修复代码return $date->format($format);
通过
{{1}}
我希望这会有所帮助。