Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c LDAP日期到NSDate_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c LDAP日期到NSDate

Objective c LDAP日期到NSDate,objective-c,macos,cocoa,Objective C,Macos,Cocoa,在执行ldapsearch时,我正在尝试从NSTask响应解析pwdLastSet值。我已经成功地提取了值1298754752411994,我正在尝试将其转换为NSDate对象 参考: 我试图从上面的页面中提取Javascript代码并进行转换,但得到的日期不同 int iYearsFrom1601to1970 = 1970 - 1601; int iDaysFrom1601to1970 = iYearsFrom1601to1970 * 365;

在执行ldapsearch时,我正在尝试从NSTask响应解析pwdLastSet值。我已经成功地提取了值1298754752411994,我正在尝试将其转换为NSDate对象

参考:

我试图从上面的页面中提取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];
任何帮助都将不胜感激


谢谢

我会这样做:

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];
这给了我一个最终日期2012-07-2403:58:22+0000

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


完成此操作后,可以通过NSDateFormatter对其进行格式化以供显示。

以下是我的操作方法:

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];
这给了我一个最终日期2012-07-2403:58:22+0000

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


完成此操作后,您可以通过NSDateFormatter运行它以对其进行格式化以供显示。

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

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
....

这应该可以解释很大的差异…

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

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
....
这应该可以解释很大的差异…

试试这个

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年不是。摘自维基百科上的

有关历元的值的说明,请参见

注:有关accountExpires的信息从12-31-1601 116444473600开始。但是,值lastLogon和lastLogonTimeStamp使用01-01-1601作为计算该值的日期11676009600。

试试这个

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年不是。摘自维基百科上的

有关历元的值的说明,请参见


注:有关accountExpires的信息从12-31-1601 116444473600开始。但是,值lastLogon和lastLogonTimeStamp使用01-01-1601作为计算该值的日期11676009600。

您得到结果的日期是什么?预计日期是什么?预计日期:2012年7月23日星期一20:05:24格林尼治标准时间:2009-04-22 19:28:22+000这也是你不想计算1601年以来的秒数的原因:……在上一个千年中,1600年和2000年是闰年,但1700年、1800年和1900年不是。摘自维基百科。还有一整件事,就是在10天内与罗马人同步。一团糟。你的成绩是什么时候?预计日期是什么?预计日期:2012年7月23日星期一20:05:24格林尼治标准时间:2009-04-22 19:28:22+000这也是你不想计算1601年以来的秒数的原因:……在上一个千年中,1600年和2000年是闰年,但1700年、1800年和1900年不是。摘自维基百科。还有一整件事,就是在10天内与罗马人同步。一团糟。这个答案不正确,因为它没有考虑闰年。@BlackFrog嗯。。。NSDate没有闰年的概念。只有当你想建立一个人类可读的日期时,这些才是相关的。我还想指出,你的答案与我的基本相同。去观看今年WWDC的244课时……那么你是说如果我有以下日期,即2012年2月28日晚上10:30 UTC,我再加上6个小时,结果是2012年3月1日凌晨4:30 UTC?不是2012年2月29日,因为今年是闰年?@BlackFrog这将是2012年2月28日22:30UTC之后的六个小时。这是29号还是1号取决于使用的NSCalendar。NSDate只是参考日期的时间偏移量。不多不少。@BlackFrog不考虑闰年是没有道理的。NSDate是时间上的偏移量,与任何日历系统无关。补偿怎么可能知道闰年是什么?这些是相对于日历的。我取一个正好对应于1601年1月1日的时间偏移量,再加上另一个偏移量,以得到一个不同的时间偏移量。只有当我想将偏移量转换成人类可读的形式时,任何事情都会发生飞跃,这都是由NSCalendar处理的。这个答案是不正确的,因为它没有考虑闰年。@BlackFrog嗯。。。NSDate没有闰年的概念。只有当你想建立一个人类可读的日期时,这些才是相关的。我还想指出,你的答案基本上是对等的
借给我的。去观看今年WWDC的244课时……那么你是说如果我有以下日期,即2012年2月28日晚上10:30 UTC,我再加上6个小时,结果是2012年3月1日凌晨4:30 UTC?不是2012年2月29日,因为今年是闰年?@BlackFrog这将是2012年2月28日22:30UTC之后的六个小时。这是29号还是1号取决于使用的NSCalendar。NSDate只是参考日期的时间偏移量。不多不少。@BlackFrog不考虑闰年是没有道理的。NSDate是时间上的偏移量,与任何日历系统无关。补偿怎么可能知道闰年是什么?这些是相对于日历的。我取一个正好对应于1601年1月1日的时间偏移量,再加上另一个偏移量,以得到一个不同的时间偏移量。只有当我想把偏移量转换成一种人类可读的形式时,任何东西都可以发挥作用,这都是由NSCalendar处理的。