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

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

这当然是urlencoded。我正在为数据库更新处理它,如下所示:

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

这个最终的 $payment_date 变量是我稍后尝试使用 PDO 插入到我的 table 中的变量。但是,上述过程返回错误:

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 时间。