在我的iOS应用程序上反复运行的代码中,我有:
// int timeStampMilliseconds = (ceil([[NSDate date] timeIntervalSince1970] * 1000.0));
// double timeStampMilliseconds = [[NSDate date] timeIntervalSince1970] * 1000.0;
// double timeStampMilliseconds = CACurrentMediaTime() * 1000;
double timeStampMilliseconds = CFAbsoluteTimeGetCurrent() * 1000.0;
double hours = fmodf(timeStampMilliseconds, 86400000) / 3600000.0;
double minutes = fmodf(timeStampMilliseconds, 3600000) / 60000.0;
double seconds = fmodf(timeStampMilliseconds, 60000) / 1000.0;
NSLog(@"Milliseconds: %lf, Hours: %lf, minutes: %lf, seconds: %lf", timeStampMilliseconds, hours, minutes, seconds);我知道获得时间的三种方法是[NSDate date] timeIntervalSince1970、CACurrentMediaTime()和CFAbsoluteTimeGetCurrent()
当我运行它们时,timeIntervalSince1970和CFAbsoluteTimeGetCurrent使UTC的时间在几秒钟内.但奇怪的是,当到达log语句时,数千秒以适当的速度增加,但在启动时,时间、分钟和秒被冻结。钟手不动。
CACurrentMediaTime显示了人们所期望的更多内容;它准确地显示了自某个时间标记以来已经过去了多少时间,这意味着秒、分钟和小时都在上升。
我想我可以做一个变通的行为,让初始化器将一个常量初始化为TimeIntervalSince1970 - CACurrentMediaTime,然后在引用的代码中添加保存的常量和CACurrentMediaTime。但是,我想知道发生了什么,以及为什么三种计时方法中的两种是输入小时、分钟和秒更新的毫秒的原始数,但是时间、分钟和秒被冻结。
谢谢,
发布于 2013-10-13 00:57:28
对于双重使用fmod(),而不是fmodf()。
格式可能是:%0.f而不是%lf。
毫秒显示是正确的,这一事实表明问题必须在其他单元的数学中,而不是时间方法。
更简单的代码:
double timeStampSeconds = [[NSDate date] timeIntervalSince1970];
double hours = fmod(timeStampSeconds / 86400, 24);
double minutes = fmod(timeStampSeconds / 3600, 60);
double seconds = fmod(timeStampSeconds, 60);
NSLog(@"Milliseconds: %lf, Hours: %.0f, minutes: %.0f, seconds: %.0f", timeStampSeconds * 1000.0, hours, minutes, seconds);但总的来说,使用Cocoa方法,如NSDateComponents和NSDateFormatter。
https://stackoverflow.com/questions/19340533
复制相似问题