我有一个Cocoa应用程序,记录事件的日期戳.我需要知道系统时间何时重置以及重置多少,但我似乎无法在任何告知我发生过这种情况的通知.这种变化可能发生,因为NTP重置时钟或因为用户重置(例如从系统偏好设置).如果NSNotification
我能注册接收会很好,但我愿意接受任何建议.
Apple 在Snow Leopard(10.6)的NSSateClockDidChangeNotification中加入了NSDate的一部分.似乎没有办法在Leopard(10.5)或更早版本中执行此操作.根据Apple NSDate文档:
系统时钟更改时发布.这可以通过调用settimeofday()或用户更改"日期和时间首选项"面板中的值来启动.通知对象为null.此通知不包含userInfo字典.
这似乎并没有告诉你"多少"时间已经改变.您可以通过定期(例如,a中每5秒NSTimer
)捕获系统时间来计算[NSDate date]
,将其保存到变量中,然后在NSSystemClockDidChangeNotification
触发后,抓住新日期并使用NSDate的timeIntervalSinceDate:
方法将两者进行比较以获得差异.
不是毫秒甚至是第二准确,但非常接近.
编辑: 看这篇文章.您可以使用UpTime()
C命令获取CPU tics中的系统正常运行时间(稍后可以将其转换为秒).您可以使用它来计算出更改的时间(假设没有系统重启或休眠).即使系统时钟被用户或网络时间协议更改,这也可以工作.
如果有人正在寻找解决方案,请知道系统日期更改事件从10.4开始
OSStatus DateChangeEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) { NSLog(@"Event received!\n"); return 0; } - (void)SystemTimeChangeHandler { EventTypeSpec eventType; eventType.eventClass = kEventClassSystem; eventType.eventKind = kEventSystemTimeDateChanged; EventHandlerUPP eventHandlerUPP = NewEventHandlerUPP(DateChangeEventHandler); EventHandlerRef eventHandlerRef = NULL; (void)InstallApplicationEventHandler( eventHandlerUPP, 1, &eventType, self, &eventHandlerRef); }