php - 解析带有可选微秒时区的 postgres 日期时间

标签 php postgresql datetime date-formatting

我想通过 DateTime::createFromFormat() 解析带有时区的 postgres 日期时间。但我不知道如何组成 $format 参数。

$dates = [
    '2016-03-04 10:29:40+01',
    '2016-03-04 10:29:40.123456+01',
];

$format = 'Y-m-d H:i:s.uP';

foreach ($dates as $value) {
    $dt = DateTime::createFromFormat($format, $value);
    var_dump($dt);
}
bool(false)

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2016-03-04 10:29:40.123456"
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+01:00"
}

第一个日期未解析,第二个日期已解析。

最佳答案

编辑

由于您只需要 DateTime::createFromFormat() 解决方案,您将面临一个问题:createFromFormat() 不支持可选部分。无法直接解析可能具有微秒的字符串。

您可以执行的黑客操作之一是搜索用于 ms 部分的 .,并动态更改您的模式:

<?
$dates = [
    '2016-03-04 10:29:40+01',
    '2016-03-04 10:29:40.123456+01',
];

foreach ($dates as $value) {
    $format = (strpos($value,'.')===FALSE) ?'Y-m-d H:i:sP':'Y-m-d H:i:s.uP';
    $dt = DateTime::createFromFormat($format, $value);
    var_dump($dt);
}

如果您无法使用 PHP::strtotime() 格式化输出,Postgresql::to_char() 可能是最好的解决方案

<?
echo date('Y-m-d H:i:s.uP', strtotime('2016-03-04 10:29:40+01'));
// 2016-03-04 01:29:40.000000-08:00

echo date('Y-m-d H:i:s.uP', strtotime('2016-03-04 10:29:40.123456+01'));
// 2016-03-04 01:29:40.000000-08:00

关于php - 解析带有可选微秒时区的 postgres 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49095408/

相关文章:

java - 为什么相减超过30天会导致答案错误

c# - 将十六进制字符串转换为日期时间的困难

php - 如何在 laravel 中使用数据库事务?

php - 真正解耦数据库CODE

php - 固定列布局 bootstrap 3

Django 和 Postgres,删除对象时出现 OperationalError

postgresql - 无法使用 PgAdmin 在 Amazon EC2 实例上远程连接到 PostgreSQL

sql - 避免列中的重复值

javascript - 限制日期选择器(从今天开始)- HTML

php - jquery 在网页上播放幻灯片的最简单方法