1

我有一个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

4 回答 4

1

您正在使用intval,但数字对于int. 只需使用:

date("m-d-Y", 1335744000000 / 1000); // 04-30-2012
于 2013-08-21T20:52:16.370 回答
1

如果您在数值计算中或直接在数值计算(也转换为 int)中SimpleXMLElement使用它,PHP 会使用字符串值。intval

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

2 147 483 647
25-01-1970

这个数字顺便说一句。有点出名,并且有自己的维基百科页面:2147483647

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

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

奖励:这里有一些代码,您可能会发现将转换代码放在中心位置并轻松使用:

/**
 * 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 扩展并添加日期创建函数来工作,这里一个用于格式化字符串,一个用于更高级的日期时间操作,它返回一个DateTimeobject

上次我在 Stackoverflow 上扩展 SimpleXMLElement 是在回答“如何用 SimpleXMLElement PHP 替换 XML 节点”问题

于 2013-08-21T20:57:41.610 回答
1

您在第二次运行中没有通过秒数:

在此处输入图像描述

于 2013-08-21T21:04:23.583 回答
0

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

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

结果:

07-20-2012
于 2013-08-21T20:52:03.377 回答