PHP日期问题

时间:2010-07-05 20:10:07

标签: php datetime date strtotime

我在PHP中有Web服务,它获取dateTime对象(来自asp)。我想以自定义格式解析这个日期。最初的日期格式为“2010-07-05T00:00:00 + 02:00”。当我在尝试这个时:

$oDate = strtotime($date_from_webservice);
$sDate = date("d.m.Y",$oDate);
echo $sDate;

我的日期是“07.04.2010”,也就是提前一天。为什么呢?

由于

3 个答案:

答案 0 :(得分:8)

看一下,原始日期($ date_from_webservice)在时区GMT + 2,时间是午夜。

我猜测PHP配置的时区是不同的(问题UTC),所以日期“出现”是前一天。但是,转换完全正确。

要解决此问题,您有以下几种选择:

  1. 询问/告诉原始服务器将日期时间恢复为UTC(这应该是它应该做的事情),确保PHP也使用UTC。

  2. 使用date_default_timezone_set或在php.ini中将PHP配置为与源服务器相同的 timezone 。请注意,由于夏令时,您不能只添加/减去小时数。

  3. 如果您确定日期时间格式一致,请使用substr。例如:

    $ sDate = substr($ oDate,8,2)。'。'。substr($ oDate,5,2)。'。'。substr($ oDate,0,4);

  4. 选项1是最好的。如果原始服务器的时区已更改,则选项2存在风险。选项3假设日期时间格式永远不会改变。

答案 1 :(得分:3)

因为您的时区偏移小于+2小时。假设你在里斯本,目前的时区偏移是UTC + 1小时。然后那个时间将是“2010-07-04T23:00:00 + 01:00”,也就是前一天。

您可以改为使用DateTime

$date = new DateTime("2010-07-05T00:00:00+02:00");
echo $date->format("d.m.Y"); //echoes 05.07.2010

这会自动将时区“+02:00”与日期相关联,以确保格式正确。

另一方面:

$date = new DateTime("2010-07-05T00:00:00+02:00");
$date->setTimeZone(new DateTimezone("Europe/Lisbon"));
echo $date->format("d.m.Y"); //echoes 04.07.2010

答案 2 :(得分:1)

PHP在格式化date字符串时使用(邪恶的)全局时区。您可以拨打date_default_timezone_set

来使用$oDate的时区
$oDate = strtotime($date_from_webservice);

$oldTimezone = date_default_timezone_get();
date_default_timezone_set(date('e', $oDate));

$sDate = date('d.m.Y', $oDate);

date_default_timezone_set($oldTimezone);

echo $sDate;