Парсинг postgres datetime с часовым поясом с дополнительными микросекундами

Я хочу разобрать postgres datetime с часовым поясом DateTime :: createFromFormat (). Но я не знаю, как сочинять $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"}

Первое свидание не анализируется, второе да.

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
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector