PHP:时区调整函数计算Y-m-d H:i:s与Y-m-d不同


PHP: Timezone adjustment function calculates Y-m-d H:i:s differently than Y-m-d

我有一个自定义编写的PHP函数,它将传递的传递值转换为用户的时区(getSystem('timezone')行)。下面是函数:

function dateAdjusted($format = 'Y-m-d H:i:s', $when = null) {
    if(is_int($when)) $when = date($format, $when); // already in epoch, change to string
    else $when = date($format, strtotime($when));
    $utc_date = DateTime::createFromFormat($format, $when, new DateTimeZone('UTC'));
    $local_date = $utc_date;
    $zone = getSystem('timezone');
    $zone_obj = new DateTimeZone($zone);
    $local_date->setTimeZone($zone_obj);
    $result = $local_date->format($format);
    return $result;
}

注意它总是从UTC转换过来的,因为那是我们存储在数据库中的。在一个时区设置为America/New_York的系统上,我得到一个奇怪的错误:

echo dateAdjusted('Y-m-d H:i:s', strtotime('2015-07-28 00:00:00')); // 2015-07-27 20:00:00echo dateAdjusted('Y-m-d', strtotime('2015-07-28 00:00:00')); // 2015-07-28

我所做的就是删除H:i:s,它在一天内停止计算…我错过了什么?

$when = date($format, strtotime($when))正在将日期时间转换为您定义的格式。

因此,当您尝试转换时区时,$when将错过日期的时间。