我正在解析一个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文件时我没有处理原始日期转换,所以我不确定我哪里出错了。任何帮助表示赞赏。
答案 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)
你在第二轮比赛中没有超过秒数:
答案 3 :(得分:0)
可能的UTC,并切换日期和月份:
echo gmdate('m-d-Y',1342742400000 / 1000);
结果:
07-20-2012