2009-04-12 3 views

ответ

254
NSDate *start = [NSDate date]; 
// do stuff... 
NSTimeInterval timeInterval = [start timeIntervalSinceNow]; 

timeInterval разница между началом и в настоящее время, в секундах, с суб-точностью до миллисекунд.

+1

+1, Ницца и Восток Ответ. Благодарю. :) – mAc

+5

, так что это отрицательное значение, если я правильно понял –

+18

@NicolasZozol вы можете использовать 'fabs (...)', чтобы получить абсолютное значение float. Например. 'NSTimeInterval timeInterval = fabs ([start timeIntervalSinceNow]);' –

5

использовать функцию timeIntervalSince1970 класса NSDate, как показано ниже:

double start = [startDate timeIntervalSince1970]; 
double end = [endDate timeIntervalSince1970]; 
double difference = end - start; 

в основном, это то, что я использую, чтобы сравнить разницу в секундах между 2 разными датами. Кроме того, проверьте эту ссылку here

23

Используйте timeIntervalSinceDate метод

NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate]; 

NSTimeInterval является просто double, определяет в NSDate так:

typedef double NSTimeInterval; 
14

Ни для кого приходит сюда в поисках реализации GetTickCount() для прошивки, здесь после объединения различных источников:

#include <mach/mach.h> 
#include <mach/mach_time.h> 

uint64_t getTickCount(void) 
{ 
    static mach_timebase_info_data_t sTimebaseInfo; 
    uint64_t machTime = mach_absolute_time(); 

    // Convert to nanoseconds - if this is the first time we've run, get the timebase. 
    if (sTimebaseInfo.denom == 0) 
    { 
     (void) mach_timebase_info(&sTimebaseInfo); 
    } 

    // Convert the mach time to milliseconds 
    uint64_t millis = ((machTime/1000000) * sTimebaseInfo.numer)/sTimebaseInfo.denom; 
    return millis; 
} 
+0

Кто-нибудь знает, почему на вызове mach_timebase_info есть избыточный (void)? –

+0

@SimonTillson - хороший вопрос - либо нужно было заставить замолчать предупреждение, либо я скопировал его из другого места и просто не заметил, чтобы удалить его. Я не помню. –

200

Вы не должны полагаться на [NSDate date] для целей синхронизации, так как оно может превышать или недооценивать прошедшее время. Есть даже случаи, когда ваш компьютер будет, по-видимому, путешествовать во времени, так как прошедшее время будет отрицательным! (Например, если часы перемещаются назад во время.)

Согласно Aria Хагиге в «Advanced IOS Gesture Recognition» лекции Winter 2013 Stanford iOS course (34:00), вы должны использовать CACurrentMediaTime() если вам нужен точный промежуток времени.

Objective-C:

#import <QuartzCore/QuartzCore.h> 
CFTimeInterval startTime = CACurrentMediaTime(); 
// perform some action 
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; 

Свифта:

let startTime = CACurrentMediaTime() 
// perform some action 
let elapsedTime = CACurrentMediaTime() - startTime 

Причина заключается в том, что [NSDate date] синхронизируется на сервере, так что это может привести к "икота времени синхронизации" что может привести к очень сложным ошибкам. С другой стороны, CACurrentMediaTime() - это время устройства, которое не изменяется при этих сетевых синхронизациях.

Вам необходимо установить add в положение QuartzCore framework в настройки вашей цели.

+14

Пожалуйста, воздержитесь от этого. Хотя я думаю, что каждый может согласиться с тем, что NSDate должен быть вашим первым вариантом, это предложение разрешило мою проблему. При вызове '[NSDate date]' в блоке завершения в блоке отправки я получал то же самое «текущее» время, которое сообщалось в [NSDate date] 'непосредственно перед тем, как выполнение достигло точки, в которой были созданы мои блоки. 'CACurrentMediaTime()' решил эту проблему. – n00neimp0rtant

+0

Как использовать elapsedTime для отображения, например mm: ss? – CyberMew

+0

Почему я никогда не слышал об этом ... – Morkrom

1

Другие ответы правильные (с оговоркой *).Я добавляю этот ответ просто, чтобы показать пример использования:

- (void)getYourAffairsInOrder 
{ 
    NSDate* methodStart = [NSDate date]; // Capture start time. 

    // … Do some work … 

    NSLog(@"DEBUG Method %s ran. Elapsed: %f seconds.", __func__, -([methodStart timeIntervalSinceNow])); // Calculate and report elapsed time. 

}

На консоли отладчика, вы видите что-то вроде этого:

DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds. 

* Оговорка: Как другие упомянули , используйте NSDate для расчета прошедшего времени только для случайных целей. Одной из таких целей может быть обычное тестирование, сырое профилирование, где вам просто нужно грубое представление о том, как долго проходит метод.

Риск состоит в том, что установка текущего времени часов устройства может измениться в любой момент из-за синхронизации сетевых часов. Так что NSDate время может прыгать вперед или назад в любой момент.

Смежные вопросы