彼此之后的两个[NSDate日期]总会返回不同的时间吗?

时间:2011-10-21 20:28:39

标签: objective-c date nsdate

dateA和dateB总是不同吗?

// Two [NSDate date] following each other
NSDate *dateA = [NSDate date];    // Line X
NSDate *dateB = [NSDate date];    // Line X+1

也就是说,下面的行总是会返回NO?

[dateA isEqualToDate:dateB]

(“始终”意味着像一个非常快的处理器不会如此快地执行这两个命令,以至于dateA和dateB将以“亚秒”精度被分配相同的时间。)

我希望为某些内部标识(不是与DB相关的)提供“唯一”时间戳。

4 个答案:

答案 0 :(得分:4)

dateB之后dateA没有承诺。 NSDate基于系统时钟,可以根据NTP信息向前或向后突变。有两次NSDate次碰撞会非常令人惊讶,但没有承诺不会发生这种情况。

如果你需要更好的东西,我建议mach_absolute_time()CACurrentMediaTime()。它们总是在程序运行期间增加。它们是自上次启动设备以来的测量时间,因此它们在下次重启之前才是唯一的。如果你需要总是增加的东西,通过跟踪偏移来构建它是非常容易的。 mach_absolute_time()跟踪CPU滴答,所以我不相信在同一个线程上对它的两次调用可以返回相同的值。

答案 1 :(得分:2)

不能保证它们可以相同,尽管它们可能取决于时间。文档声明当前时间返回。它可以在这两行的执行之间改变,或者如果它发生得足够快就可以保持不变。

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html#//apple_ref/doc/uid/20000188-date

如果您需要唯一身份证明,那么您应该考虑生成GUID。结帐:

http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFUUIDRef/Reference/reference.html

答案 2 :(得分:0)

从技术上讲,是的。对NSDate的调用按顺序发生,而不是同时发生,因此调用之间的时间会有所不同。但如果您正在寻找独特的时间戳,那就没关系。

答案 3 :(得分:0)

NSDate具有亚毫秒精度,因此很难想象您最终会得到相同的时间戳。预计未来更快的硬件也将提供随着性能改进而扩展的时序精度。

简单的示例代码 - 只需获得一系列NSDate,无需任何干预代码。我打赌他们的变化远远高于最后的小数位,这表明你会很好。