Active Direcory "whenCreated" to MySQL datetime


Active Direcory "whenCreated" to 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]);

类似的东西?

<?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');

在convert_ldap_time函数中使用 rtrim 并不十分正确。对于值 $ldap_time='20160412182250.0Z' 或句点前带有"0"的任何其他值,函数将返回 false。rtrim 的第二个参数是要删除的字符掩码,因此"0"也会被修剪。改善这一点的一种方法是将输入截断为 14 个字符,并在末尾附加"Z"。例如

$format = DateTime::createFromFormat('YmdHis', substr($ldap_time,0,14). 'Z');