1

当我执行 ldapsearch 时,我试图从 NSTask 响应中解析 pwdLastSet 值。我已成功提取值 (129875475241190194),并尝试将其转换为 NSDate 对象。

参考: http: //www.chrisnowell.com/information_security_tools/date_converter/Windows_active_directory_date_converter.asp

我试图从上面的页面中提取 Javascript 代码并进行转换,但我得到了不同的日期。

        int iYearsFrom1601to1970 = 1970 - 1601;
        int iDaysFrom1601to1970 = iYearsFrom1601to1970 * 365;
        iDaysFrom1601to1970 += (int)(iYearsFrom1601to1970 / 4); // leap years
        iDaysFrom1601to1970 -= 3; // non-leap centuries (1700,1800,1900).  2000 is a leap century
        float iSecondsFrom1601to1970 = iDaysFrom1601to1970 * 24 * 60 * 60;

        int iTotalSecondsSince1601 = (int)(129875475241190194 / 10000000);

        float iTotalSecondsSince1970 = iTotalSecondsSince1601 - iSecondsFrom1601to1970;

        NSDate *date = [NSDate dateWithTimeIntervalSince1970:iTotalSecondsSince1970];

任何帮助,将不胜感激。

谢谢!

4

3 回答 3

14

这是我的做法:

NSDateComponents *base = [[NSDateComponents alloc] init];
[base setDay:1];
[base setMonth:1];
[base setYear:1601];
[base setEra:1]; // AD

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *baseDate = [gregorian dateFromComponents:base];
[base release];
[gregorian release];

NSTimeInterval timestamp = 129875475241190194.0 / 10000000.0;

NSDate *finalDate = [baseDate dateByAddingTimeInterval:timestamp];

这给了我一个finalDate.2012-07-24 03:58:22 +0000

由于时间戳是自 1601 年 1 月 1 日 00:00 UTC 以来的时间间隔,您可以使用-dateByAddingTimeInterval:on 方法NSDate将时间戳添加到基准日期以获取最终的NSDate.

完成后,您可以通过运行它NSDateFormatter来格式化它以供显示。

于 2012-08-15T23:16:09.223 回答
2

假设基准时间之间的大胆转换是正确的:实际查看警告而不是将它们丢弃,实际上可能会有所帮助:

int main(void)
{
    int iTotalSecondsSince1601 = (129875475241190194 / 10000000);
    return 0;
}

stieber@gatekeeper:~$ clang++ Test.cpp
Test.cpp:4:8: warning: implicit conversion from 'long' to 'int' changes value from 12987547524 to 102645636
....

这应该解释了很大的差异......

于 2012-08-15T23:23:12.983 回答
0

试试这个

NSTimeInterval value = 129875475241190194;
// instead of trying to compute seconds between 1601 and 1970
const NSTimeInterval EPOCH = 11644473600;
const NSTimeInterval NANO = 10000000;

NSTimeInterval seconds = value / NANO - EPOCH;
NSDate *answer = [NSDate dateWithTimeIntervalSince1970:seconds];

这也是您不想计算自 1601 年以来的秒数的原因: ...在上个千年中,1600 和 2000 是闰年,但 1700、1800 和 1900 不是。摘自维基百科的公历

EPOCH 的值在Convert Active Directory "LastLogon:" time to (UNIX) readable time 中进行了解释。

注意:accountExpires的信息从 12-31-1601 (11644473600) 开始。然而, lastLogonlastLogonTimeStamp值使用 01-01-1601 作为日期来计算该值 (11676009600)。

于 2012-08-16T13:19:40.920 回答