簡體   English   中英

如何在Cocoa應用程序中收到系統時間更改的通知?

[英]How can I get notified of a system time change in my Cocoa application?

我有一個Cocoa應用程序,記錄事件的日期戳。 我需要知道系統時間何時重置以及重置多少,但我似乎無法在任何告知我發生過這種情況的通知。 這種變化可能發生,因為NTP重置時鍾或因為用戶重置(例如從系統偏好設置)。 如果只有我可以注冊接收的NSNotification會很棒,但我願意接受任何建議。

Apple在Snow Leopard(10.6)的NSSateClockDidChangeNotification中加入了NSDate的一部分。 似乎沒有辦法在Leopard(10.5)或更早版本中執行此操作。 根據Apple NSDate文檔

系統時鍾更改時發布。 這可以通過調用settimeofday()或用戶更改“日期和時間首選項”面板中的值來啟動。 通知對象為null。 此通知不包含userInfo字典。

這似乎並沒有告訴你“多少”時間已經改變。 您可以通過定期(例如,在NSTimer每隔5秒)使用[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);

}

時間不斷變化。 每當當前時間改變時的通知將是一個恆定的,CPU浸泡的通知流。

您需要做的是獲取事件處理程序中的當前時間 - 接收您正在進行日期戳記的事件的時間。 您可以通過調用[NSDate date]獲取當前時間。

我認為沒有一種方法可以做到這一點,因為時間可以改變的機制不同。 但它不會非常昂貴(太貴了?不知道,你有沒有對它進行分析?;-)每秒設置一次NSTimer以檢查時間並將其與之前的值進行比較。 如果它沒有提前約一秒鍾,就會發生一些有趣的事情,你可以通知你的審計對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM