LDAP日期到NSDate

use*_*905 1 macos cocoa objective-c

我正在尝试在执行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];
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

谢谢!

Dav*_*ong 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];
Run Code Online (Sandbox Code Playgroud)

这给了我finalDate2012-07-24 03:58:22 +0000.

由于时间戳是从1601年1月1日00:00 UTC开始的时间间隔,因此您可以使用-dateByAddingTimeInterval:方法on NSDate将时间戳添加到基准日期以获得最终结果NSDate.

完成后,您可以通过它NSDateFormatter来格式化它以进行显示.

  • @BlackFrog"没有考虑到闰年"没有意义.无论任何日历系统如何,"NSDate"都是时间偏移.偏移怎么可能有关于闰年的概念?这些都与日历有关.我在时间上取一个偏移量(恰好对应于1/1/1601)并为其添加另一个偏移量,以便及时得到不同的偏移量.只有当我想将这个偏移量转换成一个人类可读的形式,即任何事情都会发挥作用时,这一切都由`NSCalendar`处理. (17认同)