首页 > 解决方案 > 将带有 GMT 的字符串转换为日期时间格式 - php

问题描述

我在集成 bKash 在线支付网关 API 时遇到了这个问题。文档在这里 - https://developer.bka.sh/docs/create-payment-1

在“创建付款”部分 bKash 返回paymentCreateTime字符串,格式如下。

2020-01-07T11:55:34:438 GMT+0600

如何将其转换2020-01-07 11:55:34为保存在 MySQL 中?

我找到了类似以下方式的解决方案。

$input     = "2020-01-07T11:55:34:438 GMT+0600"                   // "2020-01-07T11:55:34:438 GMT+0600"
$timestamp = substr($input,0,19);                                 // "2020-01-07T11:55:34"
$mysql     = date_format(date_create($timestamp),'Y-m-d H:i:s');  // "2020-01-07 11:55:34"

但我需要一个没有substr()功能的解决方案。

标签: phplaraveldatetimepayment-gatewaygmt

解决方案


您可以使用createFromFormat()直接解析您的字符串。

重要的是,您需要逃脱T并且GMT.

https://www.php.net/manual/en/datetime.createfromformat.php中的所有其他内容

$input = '2020-01-07T11:55:34:438 GMT+0600';
$date = DateTime::createFromFormat('Y-m-d\Th:i:s:u \G\M\TO', $input);
echo $date->format('Y-m-d h:i:s');

这将干净地交付一个您可以随意格式化的对象。

这是一个演示

$date = new DateTime("now");
echo $date->format('Y-m-d\Th:i:s:u \G\M\TO');

echo "\n---\n";

$input = '2020-01-07T11:55:34:438 GMT+0600';
echo $input;

echo "\n---\n";

$date = DateTime::createFromFormat('Y-m-d\Th:i:s:u \G\M\TO', $input);
echo $date->format('Y-m-d h:i:s');

echo "\n===\n";

var_dump($date);

演示输出:

2020-01-07T10:12:53:000245 GMT+0100
---
2020-01-07T11:55:34:438 GMT+0600
---
2020-01-07 11:55:34
===
object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2020-01-07 11:55:34.438000"
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+06:00"
}

推荐阅读