无法在MySQL表中输入PayPal IPN返回的日期-时间值


Unable to enter date time value returned by PayPal IPN into MySQL table

Paypal IPN返回一个$_POST负载,其中包括一个名为payment_date的日期时间项。此变量的值采用以下格式:

23%3A54%3A48+Jul+23%2C+2016+PDT

这当然是url编码的。我正在处理数据库更新,如下所示:

$payment_date = date( 'Y-m-d H:i:s', urldecode($_POST['payment_date']) );

最后一个$payment_date变量是我稍后尝试使用PDO插入到表中的变量。然而,上述过程返回错误:

A non well formed numeric value encountered in /purchases/paypal_ipn.php on line 70

尽管有错误,插入仍然有效,但输入的日期不正确:

1970-01-01 00:00:00

在此之前,我只尝试过没有任何格式的urldecode:

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

这个允许数据库插入,没有任何错误,但输入的值仍然不正确:

0000-00-00 00:00:00

这里有我遗漏的东西吗?

以下是PayPal解码的时间戳:

23:54:48 Jul 23, 2016 PDT

这不是MySQL的标准格式,但您可以使用STR_TO_DATECONVERT_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时间。