首页 > 编程, 技术 > 活动目录中时间日期格式的总结

活动目录中时间日期格式的总结

2009年5月3日

活动目录中关于日期和时间的存储还是比较复杂的,如果是用ldap直接操作的话,需要了解得比较清楚的。这里查了一些文档,做一个笔记。

AD中关于时间的属性有两种类型:

1.NT时间戳型:

以lastLogon、pwdLastSet、accountExpires等属性为代表,这类属性的类型(syntax)其实就是一个大整数。NT时间戳与Unix时间戳的思想是一样的,只是前者的定义更bt一些:从1601年1月1日0时起经过的1E-7秒(即100纳秒)的个数(时间是GMT的)。

官方文档可以参考:How to convert date/time attributes in Active Directory to standard time format

如果用PHP之类的语言操作AD,可以先求出标准的Unix时间戳,然后乘上1E7,再加上1970年1月1日00:00:00的NT时间戳(常量:116445312000000000)即得到了NT时间戳。这需要用到计算大数值的BC库,如果没有的话也可以改用字符串,不乘那个1E7,而是直接转成字符串接上7个”0″

2. Generalized Time/Universal time 类型

这种以whenCreated、whenChanged属性为代表,这种属性的类型是真正的时间类型。

这种格式的说明在MSDN上的这个页面:http://msdn.microsoft.com/en-us/library/cc223266(PROT.10).aspx

格式的核心是由ISO8601定义的,W3上的 Date and Time Formats一文介绍得比较易读。不过实际使用的格式不包括横线、冒号等分隔符,具体格式是由ITUX680规定的(在64~65页)。

概括起来,这种格式就是年月日时分秒连续地写在一起,加上一个小数点后的秒值(一般为0),再加上时区,小数点和时区都不可省略。
对于UTC时间,它就形如:20090502173227.0Z 
对于本地时间,它就形如:20090503013227.0+0800 (这两个时间是同一个)

一般来说,向AD中写入时,可以用本地的表示也可以用UTC的表示,但是读出来的时候,都是UTC表示(也就是以Z结尾的) 

 

如果你是PHP用户,可以参照下面的代码实现DateTime对象与Generalized Time格式的相互转化:

 

    function DateTimeToGeneralizedTime($datetime) {
        return $datetime->format(‘YmdHis.0O’);
    }

    function GeneralizedTimeToDateTime($str) {
        $ret = strptime($str, ‘%Y%m%d%H%M%S.0%z’);
        if (!$ret) $ret = strptime($str, ‘%Y%m%d%H%M%S.0%Z’);

        $gmtTimestamp = gmmktime($ret['tm_hour'], $ret['tm_min'], $ret['tm_sec'], $ret['tm_mon'] + 1, $ret['tm_mday'], $ret['tm_year'] + 1900);

        $ret = getdate($gmtTimestamp);

        $datetime = new DateTime();
        $datetime->setDate($ret['year'], $ret['mon'], $ret['mday']);
        $datetime->setTime($ret['hours'], $ret['minutes'], $ret['seconds']);

        return $datetime;
    }

 

 

编程, 技术 , ,