php - 将xml(毫秒?)转换为可读日期

时间:2013-08-21 20:45:43

标签: php xml simplexml integer-overflow

我正在解析一个XML文件,然后使用PHP插入我的数据库。然而,日期节点是一种奇怪的XML格式,我认为它是毫秒。到目前为止,我尝试将此转换为未成功,我希望有人可以指出我的错误。

XML

<est__start>1335744000000</est__start>
<est__end>1342742400000</est__end>

转换之前这个更易读的日期

<est__start> 04-30-2012 </est__start>
<est__end> 07-20-2012 </est__end>

PHP

$start = $data->est__start;
if (empty($start)) {
    $start = '';
} else {
    $start = intval($start);            
    $seconds = $start / 1000;
    $start = date("d-m-Y", $seconds);
}
$end = $data->est__start;
if (empty($end)) {
    $end = '';
} else {
    $end = intval($end);            
    $seconds = $end / 1000;
    $end = date("d-m-Y", $end);
}

然而,最终结果总是类似于

25-01-1970

我需要它看起来像转换前一样。喜欢这个

04-30-2012

因为当我进入XML文件时我没有处理原始日期转换,所以我不确定我哪里出错了。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

您使用的是intval,但int的数字太大了。 只需使用:

date("m-d-Y", 1335744000000 / 1000); // 04-30-2012

答案 1 :(得分:1)

如果您在intval中使用SimpleXMLElement,或者直接在数值计算中使用2147483647,则使用DateTime object的字符串值。

正如我已经评论过的那样,我的第一个快速猜测是正确的,它会截断数字而不是32位系统上签名的最大整数(2 31 - 1)(我猜你是使用一个)导致:

2 147 483 647
25-01-1970

这个数字btw。有点着名的并且有自己的维基百科页面:answer to the "How to replace XML node with SimpleXMLElement PHP" question

而是使用floatval功能,它可以为您提供所需内容:

$seconds = floatval($start) / 1000;
echo date("d-m-Y", $seconds); # prints "30-04-2012"

Bonus:以下是一些代码,您可以轻松地将转换代码放在中央位置并轻松使用:

/**
 * Class MySimpleXMLElement
 *
 * Extended SimpleXMLElement
 */
class MySimpleXMLElement extends SimpleXMLElement
{
    /**
     * @param string $format
     *
     * @return bool|string
     */
    public function getDateFromMilliseconds($format = "d-m-Y") {
        return date("d-m-Y", floatval($this) / 1000);
    }

    /**
     * @param DateTimeZone $timezone
     *
     * @return DateTime
     */
    public function createDateTimeFromMilliseconds(DateTimeZone $timezone = NULL) {
        return new DateTime('@' . (floatval($this) / 1000), $timezone);
    }
}

$data  = new MySimpleXMLElement('<r><est__start>1335744000000</est__start><est__end>1342742400000</est__end></r>');
/* @var $start MySimpleXMLElement */
$start = $data->est__start;

echo $start->getDateFromMilliseconds(), "\n"; # prints "30-04-2012"

echo $start->createDateTimeFromMilliseconds()->format('Y-m-d'); # prints "2012-04-30"

它的工作原理是从SimpleXMLElement扩展并添加日期创建函数,这里有一个用于格式化字符串,对于更高级的日期时间操作,可以返回{{3}}。

上次我在Stackoverflow上扩展的SimpleXMLElement是{{3}}。

答案 2 :(得分:1)

你在第二轮比赛中没有超过秒数:

enter image description here

答案 3 :(得分:0)

可能的UTC,并切换日期和月份:

echo gmdate('m-d-Y',1342742400000 / 1000);

结果:

07-20-2012