解析postgres日期时间与时区可选的微秒

问题描述 投票:1回答:1

我想通过DateTime::createFromFormat()用timezone解析postgres datetime。但我不知道,如何撰写$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"
}

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

php postgresql datetime date-formatting
1个回答
1
投票

编辑

如果你只想要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
© www.soinside.com 2019 - 2024. All rights reserved.