Php 无法将PayPal IPN返回的日期时间值输入MySQL表

Php 无法将PayPal IPN返回的日期时间值输入MySQL表,php,mysql,paypal-ipn,Php,Mysql,Paypal Ipn,Paypal IPN正在返回一个$u POST有效负载,其中包括一个名为payment\u date的日期时间项。此变量的值采用以下格式: 23%3A54%3A48+Jul+23%2C+2016+PDT 当然,这是URL编码的。我正在按如下方式处理数据库更新: $payment_date = date( 'Y-m-d H:i:s', urldecode($_POST['payment_date']) ); 最后一个$payment\u date变量是我稍后尝试使用PDO插入到表中的变量。但是

Paypal IPN正在返回一个$u POST有效负载,其中包括一个名为
payment\u date
的日期时间项。此变量的值采用以下格式:

23%3A54%3A48+Jul+23%2C+2016+PDT
当然,这是URL编码的。我正在按如下方式处理数据库更新:

$payment_date = date( 'Y-m-d H:i:s', urldecode($_POST['payment_date']) );
最后一个
$payment\u date
变量是我稍后尝试使用PDO插入到表中的变量。但是,上述过程返回一个错误:

A non well formed numeric value encountered in /purchases/paypal_ipn.php on line 70
尽管有错误,插入仍在工作,但输入的日期不正确:

1970-01-01 00:00:00
0000-00-00 00:00:00
在此之前,我只尝试了urldecode,没有任何格式:

$payment_date = urldecode($_POST['payment_date']) );
这一次允许db insert没有任何错误,但输入的值仍然不正确:

1970-01-01 00:00:00
0000-00-00 00:00:00

这里有什么我遗漏的吗?

这里是贝宝解码的时间戳的样子:

23:54:48 Jul 23, 2016 PDT
这不是MySQL的标准格式,但是您可以使用
STR\u to\u DATE
convert\u TZ
组合来转换它:

SELECT CONVERT_TZ(STR_TO_DATE(SUBSTRING(col, 1, 21), '%H:%i:%s %b %d, %Y'),
                  SUBSTRING(col, 23),      -- convert from PDT
                  '+00:00')                -- convert to UTC time

这个答案有两个作用。首先,调用
STR_to_DATE
将PayPal时间戳转换为合法的MySQL日期时间。如果你不在乎时区,你可以停在这里。如果您确实关心时区,那么您也可以在时间戳上调用
CONVERT_TZ
,将其从加利福尼亚夏令时转换为UTC时间。

在PHP中没有办法做到这一点,即使用PHP函数/算法而不是干扰SQL查询吗?如果在将其传递给查询之前,我使用PHP字符串操作函数之一从值中删除时区部分,该怎么办?您可以直接将
YYYY-MM-DD HH-MM SS
格式的字符串从PHP插入MySQL,但这需要您以这种格式构建字符串。
STR\u TO\u DATE
的好处在于它为您解决了这个问题。