【问题标题】:Is there a way to get timeIntervalSince1970 without using NSDate?有没有办法在不使用 NSDate 的情况下获得 timeIntervalSince1970?
【发布时间】:2011-08-31 23:42:03
【问题描述】:

我试图避免创建 NSDate 对象,因为我的代码需要“当前时间”。我最终打电话给 [[NSDate date] timeIntervalSince1970] 很多。有什么方法可以在不实例化对象的情况下获取时间间隔?

【问题讨论】:

  • 你能用 C 的 time() 函数吗?

标签: objective-c cocoa nsdate


【解决方案1】:

CFAbsoluteTimeGetCurrent 为您提供类似的准确度 - 无需对象。

CFAbsoluteTimeGetCurrent 使用不同的基准日期(或参考日期),因此如果您需要使用另一个基准日期(例如相对于 1970 年的某个时间),您必须首先确定偏移量或基准日期。

【讨论】:

  • 结合 NSTimeIntervalSince1970 常量将得到 timeIntervalSince1970。
【解决方案2】:
NSTimeInterval interval = [NSDate timeIntervalSinceReferenceDate];

【讨论】:

  • 根据 Apple 的文档,它是 iOS 2.0 或更高版本以及 MacOS 10.0 或更高版本中的类方法。
  • 这仍然不如CFAbsoluteTimeGetCurrent() 高效,因为方法调度的开销(诚然非常小)。
  • @Rob Keniger 虽然原则上我同意你的观点,但在这个级别进行优化是疯狂的,除非分析表明它是必要的。话虽如此,人们总是可以缓存 IMP 并直接调用它以保留 NS 级别的 API。
【解决方案3】:

您删除了有关比CFAbsoluteTimeGetCurrent 更准确的选项的评论:试试gettimeofday

【讨论】:

  • 事实证明 CFAbsoluteTimeGetCurrent 返回一个以微秒为单位的双精度数。
  • @David 从技术上讲,CFAbsoluteTimeGetCurrent 的准确度只有 亚秒。例如,当前时间为double 将丢失几位用户精度所需的数字。对于微秒精度,您必须使用gettimeofday(或类似的东西)。但是似乎CFAbsoluteTimeGetCurrent 是合适的。
  • 如果您需要 usec 精度并且更喜欢坚持使用 CF-apis,CFGregorian* apis 应该可以工作(他们使用结构来表示时间)。
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 2019-11-09
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2016-01-19
相关资源
最近更新 更多