Active Directory“whenCreated”到MySQL datetime

时间:2014-11-17 20:15:50

标签: php active-directory

是否有更紧凑和优雅的方式来转换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]);

3 个答案:

答案 0 :(得分: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);
?>

答案 1 :(得分: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');

答案 2 :(得分:0)

在convert_ldap_time函数中使用rtrim并不完全正确。对于$ ldap_time ='20160412182250.0Z'的值或在该句点之前具有'0'的任何其他值,该函数将返回false。 rtrim的第二个参数是要删除的字符的掩码,所以'0'也被修剪掉了。改善这种情况的一种方法是将输入截断为14个字符,并在末尾追加“Z”。 E.g。

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