【问题标题】:Error when ISO 8601 date/time sent over HTTP and created in to PHP DateTime object通过 HTTP 发送 ISO 8601 日期/时间并在 PHP DateTime 对象中创建时出错
【发布时间】:2014-12-12 20:22:21
【问题描述】:

我有一个符合 ISO 8601 的日期/时间字符串 2014-12-11T23:43:44+00:00,我通过 HTTP 将它传递到 Web 服务器。在那里,我从我的 HTTP POST 字段中提取数据,一切都很好,当我 print_r 我的参数时,值返回为2014-12-11T23:43:44 00:00

但我注意到,+ 现在不见了,(我猜这是在数据的呈现中,而不是数据被编码为什么,不是(?)问题,对吧?)

然后,在将值解析为参数以创建新的 DateTime 对象时,我收到以下错误:

DateTime::__construct(): Failed to parse time string (2014-12-11T23:43:44 00:00) at position 20 (0): Double time specification

我猜这是因为它将附加的00:00 视为23:43:44 之后的另一个时间,当然这是时差。

这是因为+ 丢失还是我做错了什么?

我还应该指出,我的原始值 (2014-12-11T23:43:44+00:00) 来自 http://www.timestampgenerator.com 的 ISO 8601 字段。

编辑:

这是我用来从 PHP 中的 POST 请求中获取字符串的代码:

static function request_parameters($including_request_uri = false)
{
    $request_parameters = $_REQUEST;

    if (!$including_request_uri)
    {
        unset($request_parameters[PARAMETER_NAME_REQUEST]);
    }

    return $request_parameters;
}

然后我像这样检索值:

$parameters =       RESTController::request_parameters();
$date_created =     $parameters[UNIVERSALLY_UNIQUE_OBJECT_KEY_DATE_CREATED];

【问题讨论】:

  • 你确定是 POST 吗? + 是在 URL 中表示空格的一种形式,所以如果我们谈论 GET,这将很容易解释。
  • 意料之中。 URL 中的+ 是一个编码的空格字符。您的日期字符串正在某个地方通过 url_decode() 运行,并且 + 被解码为一个空格。如果您想通过查询字符串传递 +,它将被编码为 %2B
  • 试试 $date = preg_replace("/ /","+",$date);
  • 查看编辑了解我如何获取 POST 数据。没有url_decode() 正在发送
  • 我知道这听起来很傻,但请确保您修剪字符串以删除任何空白字符。这是一个猜测,因为网站上的数据看起来不错。

标签: php datetime iso8601


【解决方案1】:

您可以随时尝试使用trim(' ', str_replace(' ','+',$datetime)); 进行测试。这既可以去除外部的空白,又可以将您的内部空间转换为符合 ISO8901 的时间。

我相信您进来的 POST 被解释为编码空间。另一种方法(如果您可以控制发送的内容)使用以下方式发布:

$datetime = urlencode($datetime);

然后在接收端:

$datetime = urldecode($_POST['datetime']);

【讨论】:

  • 这似乎有效,但我不禁觉得这是一个快速修复/解决方法。这是解决此问题的正确方法吗?
  • 这是一种变通方法,您可以控制发布此内容的内容吗?如果是这样,我强烈建议在发送之前使用 urlencoding(如上),这将是一个真正的修复,而不是一个补丁,因为你正在逃避,而不是回避。 ;)
  • 是的,我可以控制两端。感谢您的回答
  • 不过有一点需要注意,由于某种原因,接收端不需要urldecode()。不知道为什么,让我觉得字符串可能在某处被解码(尽管在我的问题的编辑中看到它不是/不应该)
  • 另外,请注意,PHP 中的 urlencode()urldecode()。 (不知道为什么我认为还有_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多