Objective c LDAP日期到NSDate
在执行ldapsearch时,我正在尝试从NSTask响应解析pwdLastSet值。我已经成功地提取了值1298754752411994,我正在尝试将其转换为NSDate对象 参考: 我试图从上面的页面中提取Javascript代码并进行转换,但得到的日期不同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;
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处理的。