将MongoDB BSON ObjectId(oid)转换为Objective-C中生成的时间?

3
我找到了以下内容:
功能:http://github.com/timburks/NuMongoDB/blob/master/src/bson.c#L128 字节:http://github.com/timburks/NuMongoDB/blob/master/src/platform_hacks.h#L55 结构:http://github.com/timburks/NuMongoDB/blob/master/src/bson.h#L70 但是,我该如何在我的iPhone应用程序中使用此代码,从服务器获取oid作为字符串并提取created_at时间戳?这是我目前的代码。它是一个Objective-C方法,但我能否将C代码放入我的Objective-c .m文件中?
- timeFromBsonOid:(NSString *)oid {
    time_t out;
    memcpy(&out, oid, 4);
    return out;
}

马特

2个回答

6
你可以按照以下方法将oid字符串转换为NSDate:
NSString *asd = @"4c8f695bdaf9856dbe000008";
long result;
BOOL success = [[NSScanner scannerWithString:[asd substringToIndex:8]] scanHexLongLong:&result];
NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:result];

这看起来很不错,谢谢!我会试一下的。有人知道如何在我的Objective-C项目中用C语言实现吗?那样做是否值得额外的性能提升呢?可能不是吧? - ma11hew28
1
结果变量应该是一个无符号长长整型。 - Zack Angelo
我已经将这段代码作为NSDate的一个类别使用了近一年的时间。最终,我把这段代码分享到了Github上。kosii,我在README文件中将你列为了贡献者。如果还有其他需要的人,请前往以下地址查找相关代码:https://github.com/ArtSabintsev/NSDate-DateFromBSONObjectID - ArtSabintsev
是的,在32位设备上使用long而不是unsigned long long会触发与内存相关的崩溃。 - Jimmy Xu

0

Kossi的答案有点过时。确保使用unsigned long long,否则在32位和64位设备上可能会出现奇怪的行为和崩溃。

NSString *asd = @"4c8f695bdaf9856dbe000008";
unsigned long long result;
BOOL success = [[NSScanner scannerWithString:[asd substringToIndex:8]] scanHexLongLong:&result];
NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:result];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接