Существует ли более компактный и элегантный способ преобразования значений 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]);
Что-то вроде того ?
<?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);
?>
Вот функция, которая должна добиться цели, используя 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');
Использование rtrim в функции convert_ldap_time не совсем корректно. Для значения $ ldap_time = ‘20160412182250.0Z’ или любого другого значения с ‘0’ перед периодом функция вернет false. Вторым аргументом для rtrim является маска символов, которую нужно удалить, поэтому ‘0’ также обрезается. Одним из способов улучшить это было бы усечение ввода до 14 символов и добавление «Z» в конце. Например.
$format = DateTime::createFromFormat('YmdHis', substr($ldap_time,0,14). 'Z');