Active Direcory «whenCreated» в MySQL datetime

Существует ли более компактный и элегантный способ преобразования значений Active Directory «whenCreated», таких как «20141114120225.0Z», в формат даты и времени MySQL, чем приведенный ниже код?

if(preg_match("/^(....)(..)(..)(..)(..)(..)/", $value, $m))
$value = sprintf("%s-%s-%s %s:%s:%s", $m[1], $m[2], $m[3], $m[4], $m[5], $m[6]);

0

Решение

Что-то вроде того ?

<?php
// The regexp ensures only numbers were used
$valueForMySQL = preg_replace("/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+/","$1-$2-$3 $4:$5:$6", $value);
?>
0

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

Вот функция, которая должна добиться цели, используя PHP-класс DateTime.

/**
* @param string $ldap_time
* @param string $output_format
* @return bool|string
*/
public function convert_ldap_time($ldap_time, $output_format)
{
$format = DateTime::createFromFormat('YmdHis', rtrim($ldap_time, '.0Z'));
if (!$format) $format = DateTime::createFromFormat('Ymdhis', rtrim($ldap_time, '.0Z'));
return ($format) ? $format->format($output_format) : false;
}

Это позволит вам сделать что-то вроде:

$mysql_time = convert_ldap_time($whenCreated, 'Y-m-d H:i:s');
0

Использование rtrim в функции convert_ldap_time не совсем корректно. Для значения $ ldap_time = ‘20160412182250.0Z’ или любого другого значения с ‘0’ перед периодом функция вернет false. Вторым аргументом для rtrim является маска символов, которую нужно удалить, поэтому ‘0’ также обрезается. Одним из способов улучшить это было бы усечение ввода до 14 символов и добавление «Z» в конце. Например.

$format = DateTime::createFromFormat('YmdHis', substr($ldap_time,0,14). 'Z');
0
По вопросам рекламы [email protected]