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相关的)提供“唯一”时间戳。
答案 0 :(得分:4)
dateB
之后dateA
没有承诺。 NSDate
基于系统时钟,可以根据NTP信息向前或向后突变。有两次NSDate
次碰撞会非常令人惊讶,但没有承诺不会发生这种情况。
如果你需要更好的东西,我建议mach_absolute_time()
或CACurrentMediaTime()
。它们总是在程序运行期间增加。它们是自上次启动设备以来的测量时间,因此它们在下次重启之前才是唯一的。如果你需要总是增加的东西,通过跟踪偏移来构建它是非常容易的。 mach_absolute_time()
跟踪CPU滴答,所以我不相信在同一个线程上对它的两次调用可以返回相同的值。
答案 1 :(得分:2)
不能保证它们可以相同,尽管它们可能取决于时间。文档声明当前时间返回。它可以在这两行的执行之间改变,或者如果它发生得足够快就可以保持不变。
如果您需要唯一身份证明,那么您应该考虑生成GUID。结帐:
答案 2 :(得分:0)
从技术上讲,是的。对NSDate的调用按顺序发生,而不是同时发生,因此调用之间的时间会有所不同。但如果您正在寻找独特的时间戳,那就没关系。
答案 3 :(得分:0)
NSDate具有亚毫秒精度,因此很难想象您最终会得到相同的时间戳。预计未来更快的硬件也将提供随着性能改进而扩展的时序精度。
简单的示例代码 - 只需获得一系列NSDate,无需任何干预代码。我打赌他们的变化远远高于最后的小数位,这表明你会很好。