【问题标题】:eBay timestamp and timezoneeBay 时间戳和时区
【发布时间】:2013-12-27 02:25:51
【问题描述】:

我已经尝试解决这个问题好几天了,它已经到了让我头疼的地步。

我正在尝试创建一个函数,它将 ebay 时间(2013 年 12 月 27 日 05:26:29 PST)格式化为 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;
}

这是我将其转换为timestamp 函数的绝妙方法:

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。

【问题讨论】:

  • mktime的最后一个参数是夏令时参数,默认为-1,可能会导致意外的结果。您是否尝试过明确设置?
  • 您是否尝试过使用strtotimestrptime 函数?
  • @Zarazthuztra - 我没有尝试设置它。但是当我需要 PST 而不是 UTC 时间时,我认为夏令时参数对我没有任何好处:)
  • @Orifjon 我已经尝试了许多不同的组合,但是它要么返回 0,要么只是将时间戳 -18988 年等及时返回。

标签: php timestamp timezone


【解决方案1】:

您之所以会遇到此问题,是因为您将屏幕抓取技术应用于公共 HTML 页面。这不是你应该如何与 eBay 数据交互。

eBay(像大多数流行的网站一样)有一个developer API。如果你使用它,你会发现你的日期/时间值是标准的ISO-8601 format

详情请见eBay's API spec on dateTime types

【讨论】:

  • 我无法使用开发者 API,因为我正在创建一个多用户界面。
  • 这没有任何意义。
  • 另外,eBay terms of service 禁止抓取。使用 API。无论如何,您将获得更稳定的体验。您真的希望 eBay 页面的未来设计更改来破坏您的应用程序吗?
  • API 仅对一个帐户有效。您是否希望仅在一个 api 上运行多用户界面?嗯,也许可以通过对所有用户使用唯一的一个 api 来获取我需要的项目信息。
  • 我想这取决于您的用户如何匹配 eBay 帐户。您可能只能为您的应用程序拥有一个 eBay 帐户。或者,如果您的每个用户都必须访问他们自己的私人 eBay 帐户,那么您可以为每个用户使用一组不同的凭据。您可能想单独询问这个问题。我唯一的观点是 API 是首选且合法的方式。
【解决方案2】:

你做错了。从非标准日期格式获取时间戳的最佳方法是使用DateTime::createFromFormat()。不需要到处乱找那些疯狂的explode()s 并试图硬编码月份名称。只需告诉 PHP 你期望什么格式,它就会尝试从中获取一个 DateTime 对象。

(请注意,eBay (PST) 提供的时区在 PHP 中不是有效的时区,因此DateTime::createFromFormat 不会自动重新识别它。我已将其硬编码在下面。如果时区更改,您可以更改 $tz 变量以匹配 desired timezone 并更改 \P\S\T 以匹配 eBay 提供的任何内容。)

<?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 兼容,因为日期几乎 em> 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

【讨论】:

  • 这是我的问题。因为我使用的是 php 5.2,所以我不能使用 createFormFormat。我需要一个解决方法,以便我可以让它在 php 5.2 上运行。感谢 Mike 抽出宝贵时间回复我的帖子。
  • 如果您使用的是 PHP 5.2,您真的需要升级它。没有理由使用这种过时的版本。如果您使用的是共享主机并且您的主机仍在使用 5.2,请运行!它已经在end of life 使用了 2 年多了。
  • 我所能做的就是尝试解决它。我使用的其他一些程序也不支持 5.3。作者正在研究它。
  • @ToneIreneAndersen 我才发现DateTime::getTimestamp() 也不可用,所以我又改了。
  • 我现在已经尝试了这些示例.. 适用于 php 5.2 和 php 5.4,但在 5.4 中它不能与 DateTime 一起使用,它基本上只是返回 =now 时间戳,这是错误的。
【解决方案3】:

您的代码似乎合法并且可以在在线 php 执行器上运行,我只是用谷歌搜索并尝试过。您应该使用 DateTime 格式并仔细查看服务器的时间设置。或者,您可以只计算您的服务器上的结果与在线 php 编译器的结果之间的差异,并使用它来添加/减去您的函数结果(硬编码),但这是一种不好的做法。

【讨论】:

  • 它有效。它可能不是其他编码人员会怎么做的,但我已经有一段时间没有玩 PHP 了 :)
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 2012-02-29
  • 1970-01-01
  • 2010-11-10
相关资源
最近更新 更多