易趣时间戳和时区

时间:2013-12-27 02:25:52

标签: php timezone timestamp ebay

我已经试着在这几天试图解决这个问题了,它已经到了我的脑袋里。

我正在尝试创建一个函数,它将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。

感谢任何帮助。

3 个答案:

答案 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编译器之间的差异,并使用它来添加/减去函数结果(硬编码),但这是一种不好的做法。