Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP日期问题_Php_Datetime_Date_Strtotime - Fatal编程技术网

PHP日期问题

PHP日期问题,php,datetime,date,strtotime,Php,Datetime,Date,Strtotime,我有PHP中的web服务,它从asp获取dateTime对象。我想用我的自定义格式解析这个日期。原始日期格式为“2010-07-05T00:00:00+02:00”。当我尝试这个时: $oDate = strtotime($date_from_webservice); $sDate = date("d.m.Y",$oDate); echo $sDate; 我得到的日期是“07.04.2010”,比这早了一天。为什么? 谢谢,因为您的时区偏移小于+2小时。假设您在里斯本,当前时区偏移为UTC+1

我有PHP中的web服务,它从asp获取dateTime对象。我想用我的自定义格式解析这个日期。原始日期格式为“2010-07-05T00:00:00+02:00”。当我尝试这个时:

$oDate = strtotime($date_from_webservice);
$sDate = date("d.m.Y",$oDate);
echo $sDate;
我得到的日期是“07.04.2010”,比这早了一天。为什么?


谢谢,因为您的时区偏移小于+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

查看它,原始日期($date\u from\u webservice)在时区GMT+2,时间是午夜

我猜PHP配置的时区是不同的(prob.UTC),所以日期“似乎”是前一天。然而,转换是完全正确的

要解决此问题,您有两个选项:

  • 要求/告诉源服务器将日期时间返回为UTC(这是它真正应该做的),确保PHP也使用UTC

  • 使用PHP.ini中的或将PHP配置为与源服务器相同的时区。注意,由于夏令时的原因,你不能只加/减小时

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

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

  • 选择1是最好的。如果源服务器的时区已更改,则选项2存在风险。选项3假定日期时间格式永远不会更改。

    PHP在格式化
    date
    字符串时使用(邪恶的)全局时区。您可以通过调用以下命令使用
    $oDate
    的时区:


    为什么源服务器应将日期时间返回为UTC?您认为时区通常是不相关的吗?如果您将日期时间作为一个web服务提供,出于非常明显的原因,最好作为UTC提供服务,在示例中,源服务器应该输出
    2010-07-04T22:00:00+00:00
    。我从没说过时区是无关的。。。
    $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;