使用带有可选微秒的时区解析 postgres 日期时间
Parsing postgres datetime with timezone with optional microseconds
我想通过 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() is probably the best solution if you can't format your output with 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
我想通过 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() is probably the best solution if you can't format your output with 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