PHP时区转换问题

时间:2017-09-22 09:24:02

标签: php unix-timestamp date-conversion timestamp-with-timezone

我有这个功能,用于将请求日期转换为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;
    }
}

1 个答案:

答案 0 :(得分:0)

这里的问题是:$date->getTimestamp()

时间戳不带时区。 unix时间戳是自1970年1月1日午夜UTC以来所花费的秒数。 无论时区如何都是一样的。所以当你使用$date时,你会失去' return gmdate($format, $date->getTimestamp()); 对象的时区metada。

因此,您可以通过修改

来修复代码
return $date->format($format);

通过

{{1}}

我希望这会有所帮助。