【发布时间】:2011-04-10 12:32:27
【问题描述】:
我需要为我正在开发的应用程序中的一些事件计时。在 Java 中,我曾经能够调用 currentTimeMillis(),但在 Objective-c 中似乎没有一个版本。有没有办法在不创建 NSDate 的情况下检查当前时间,然后每次我需要这些信息时解析这个对象?
谢谢 -代码
【问题讨论】:
标签: iphone objective-c
我需要为我正在开发的应用程序中的一些事件计时。在 Java 中,我曾经能够调用 currentTimeMillis(),但在 Objective-c 中似乎没有一个版本。有没有办法在不创建 NSDate 的情况下检查当前时间,然后每次我需要这些信息时解析这个对象?
谢谢 -代码
【问题讨论】:
标签: iphone objective-c
正确答案是 [[NSDate date] timeIntervalSince1970];这将为您提供以毫秒为单位的当前时间戳。
@Noah Witherspoon 给出的答案返回当前日期,但年份不是当前匹配年份。
【讨论】:
[[NSDate date] timeIntervalSince1970] * 1000 返回与currentTimeMillis() 相同的值
CFAbsoluteTimeGetCurrent() 和 [NSDate timeIntervalSinceReferenceDate] 都从格林威治标准时间 2001 年 1 月 1 日 00:00:00 开始返回双精度值。
【讨论】:
timeIntervalSince1970 以秒为单位返回时间,而名称 currentTimeMillis() 暗示它返回毫秒。
还有CFAbsoluteTimeGetCurrent(),它会以双精度秒为单位提供时间。
【讨论】:
您也可以使用[NSDate timeIntervalSinceReferenceDate](类方法)代替gettimeofday() 并使用它进行计算。但他们有同样的问题:他们在“挂钟时间”上运作。这意味着如果在您的测试运行期间或在夏令时之间的过渡时添加闰秒,您的测量可能会关闭。
您可以在 OS X 和 iOS 上使用 Mach 系统调用 mach_absolute_time()。使用mach_timebase_info() 返回的信息,可以将其转换为纳秒。
【讨论】:
要获得非常便宜非常精确的时间,您可以使用gettimeofday(),它是 BSD 内核的 C 函数。请阅读手册页以获取完整的详细信息,但这里有一个简单的示例:
struct timeval t;
gettimeofday(&t, NULL);
long msec = t.tv_sec * 1000 + t.tv_usec / 1000;
【讨论】:
[[NSDate date] timeIntervalSince1970] * 1000便宜。它从 1970 年 1 月 1 日午夜(0 小时)返回间隔。如果您的代码像游戏中的更新循环一样经常被调用,您应该使用gettimeofday(&t, NULL);。对于这个大值,您最好使用 long long 数据类型:long long millis = t.tv_sec * 1000 + t.tv_usec / 1000;