我已经试着在这几天试图解决这个问题了,它已经到了我的脑袋里。
我正在尝试创建一个函数,它将ebay时间(2013年12月27日05:26:29太平洋标准时间)格式化为一个unix时间戳,但不知何故,我的系统会以非常错误的时区更改时间戳。
以下是从ebay获取日期的代码。
function getEndDate($itemno, $html)
{
global $settings;
$dom = new DOMDocument();
//<span class="vi-tm-left" id="vi-cdown_timeLeft">
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$elements = $xpath->query('//span[@class="vi-tm-left"]');
if (!is_null($elements)) {
foreach ($elements as $element) {
$enddate = strip_tags($element->nodeValue);
$enddate = str_replace("(","", $enddate);
$enddate = str_replace(")","", $enddate);
$enddate = convertEbayStamp($enddate);
return $enddate;
}
return false;
}
return false;
}
这是我很棒的将它转换为时间戳功能。 :)
function convertEbayStamp($stamp) {
$months = array('Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12);
$arr = explode(" ",$stamp);
// arr[0] = Dec, arr[1] = 31, // arr[2] = 2013, // arr[3] = 21:15:01 // arr[4] = PST
$month = $months[$arr[0]];
$day = str_replace(",","",$arr[1]);
$timeelements = explode(":",$arr[3]);
return mktime($timeelements[0],$timeelements[1],$timeelements[2], $month, $day, $arr[2]);
}
遗憾的是,我没有做过什么,设置date_timezone_set对我有用,也没有使用DateTime。
感谢任何帮助。
答案 0 :(得分:2)
您只有这个问题,因为您正在将屏幕抓取技术应用于公共HTML页面。那就是不你应该如何与eBay数据互动。
eBay(与大多数热门网站一样)都有developer API。如果您使用了它,您会发现您的日期/时间值是标准的ISO-8601 format。有关详细信息,请参阅eBay's API spec on dateTime
types。
答案 1 :(得分:1)
你真的错了。从非标准日期格式获取时间戳的最佳方法是使用DateTime::createFromFormat()。不需要所有那些疯狂的explode()
到处并试图对月份名称进行硬编码。只需告诉PHP您期望的格式,它将尝试从中获取DateTime对象。< / p>
(请注意,eBay提供的时区(PST
)不是PHP中的有效时区,因此DateTime::createFromFormat
不会自动对其进行重新编码。我已在下面对其进行了硬编码。如果时区发生变化,您可以更改$tz
变量以匹配desired timezone并更改\P\S\T
以匹配易趣提供的任何内容。)
<?php
$string = '(Dec 27, 2013 05:26:29 PST)';
$tz = 'America/Los_Angeles'; // Choose a city in your desired time zone. See link above.
$dt = DateTime::createFromFormat('(M j, Y H:i:s \P\S\T)', $string, new DateTimeZone($tz));
echo $dt->getTimestamp(); // echoes 1388150789
另外,值得注意的是,Unix时间戳不有时区。它被定义为 1 自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数。
编辑php 5.2 :
即使我强烈推荐你的PHP,因为5.2是no longer supported并且现在已经超过2年了,这里有一个我认为应该与5.2兼容的解决方法,因为日期几乎本地认可的PHP。你只需要摆脱括号和时区。这有点丑陋,但它确实有效:
$string = '(Dec 27, 2013 05:26:29 PST)';
$tz = 'America/Los_Angeles';
preg_match('/^\((.*) PST\)$/', $string, $matches);
$string = $matches[1];
$dt = new DateTime($string, new DateTimeZone($tz));
echo $dt->format('U'); // echoes 1388150789
这似乎是work for PHP 5.2。
答案 2 :(得分:0)
你的代码似乎是合法的,适用于在线php执行者,我只是谷歌搜索和尝试。您应该使用DateTime格式并仔细查看服务器的时间设置。或者,您可以只计算服务器上的结果与在线php编译器之间的差异,并使用它来添加/减去函数结果(硬编码),但这是一种不好的做法。