iPhone: Как узнать текущие миллисекунды? - PullRequest
208 голосов
/ 11 декабря 2008

Каков наилучший способ получить текущее системное время в миллисекундах?

Ответы [ 18 ]

304 голосов
/ 30 апреля 2010

Если вы планируете использовать это для относительного времени (например, для игр или анимации), я бы лучше использовал CACurrentMediaTime ()

double CurrentTime = CACurrentMediaTime();

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

Возвращает текущее абсолютное время в секундах.


Если вы хотите только десятичную часть (часто используется при синхронизации анимации),

let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
266 голосов
/ 11 декабря 2008
[[NSDate date] timeIntervalSince1970];

Возвращает количество секунд с начала эпохи как двойное. Я почти уверен, что вы можете получить доступ к миллисекундам из дробной части.

90 голосов
/ 18 августа 2012

Я протестировал все остальные ответы на iPhone 4S и iPad 3 (сборка релиза). CACurrentMediaTime имеет наименьшие издержки с небольшим запасом. timeIntervalSince1970 намного медленнее других, вероятно, из-за NSDate накладных расходов на инстанцирование, хотя это может не иметь значения для многих случаев использования.

Я бы порекомендовал CACurrentMediaTime, если вы хотите наименьших накладных расходов и не возражаете добавить зависимость Quartz Framework. Или gettimeofday, если мобильность является для вас приоритетом.

iPhone 4S

CACurrentMediaTime: 1.33 µs/call
gettimeofday: 1.38 µs/call
[NSDate timeIntervalSinceReferenceDate]: 1.45 µs/call
CFAbsoluteTimeGetCurrent: 1.48 µs/call
[[NSDate date] timeIntervalSince1970]: 4.93 µs/call

iPad 3

CACurrentMediaTime: 1.25 µs/call
gettimeofday: 1.33 µs/call
CFAbsoluteTimeGetCurrent: 1.34 µs/call
[NSDate timeIntervalSinceReferenceDate]: 1.37 µs/call
[[NSDate date] timeIntervalSince1970]: 3.47 µs/call
45 голосов
/ 02 октября 2015

В Swift мы можем сделать функцию и сделать следующее

func getCurrentMillis()->Int64{
    return  Int64(NSDate().timeIntervalSince1970 * 1000)
}

var currentTime = getCurrentMillis()

Хотя он отлично работает в Swift 3.0 , но мы можем изменить и использовать класс Date вместо NSDate в 3.0

Swift 3.0

func getCurrentMillis()->Int64 {
    return Int64(Date().timeIntervalSince1970 * 1000)
}

var currentTime = getCurrentMillis()
30 голосов
/ 25 октября 2011

До сих пор я нашел gettimeofday хорошее решение для iOS (iPad), когда вы хотите выполнить некоторую оценку интервала (скажем, частоту кадров, время рендеринга кадра ...):

#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
17 голосов
/ 18 января 2016

Swift 2

let seconds = NSDate().timeIntervalSince1970
let milliseconds = seconds * 1000.0

Swift 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds
14 голосов
/ 10 июля 2018

Для получения миллисекунд на текущую дату.

Swift 4:

func currentTimeInMilliSeconds()-> Int
    {
        let currentDate = Date()
        let since1970 = currentDate.timeIntervalSince1970
        return Int(since1970 * 1000)
    }
10 голосов
/ 28 июня 2011

Может быть полезно знать о CodeTimestamps, которые обеспечивают обертку вокруг основанных на мах функций синхронизации. Это дает вам данные синхронизации с наносекундным разрешением - в 1000000 раз точнее, чем миллисекунды. Да, в миллион раз точнее. (Префиксы - это milli, micro, nano, каждый из которых в 1000 раз точнее предыдущего.) Даже если вам не нужны CodeTimestamps, проверьте код (он с открытым исходным кодом), чтобы узнать, как они используют mach для получения данных синхронизации. Это было бы полезно, когда вам нужна большая точность и более быстрый вызов метода, чем в подходе NSDate.

http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/

8 голосов
/ 24 сентября 2014
// Timestamp after converting to milliseconds.

NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
7 голосов
/ 11 мая 2013

Мне нужен NSNumber объект, содержащий точный результат [[NSDate date] timeIntervalSince1970]. Поскольку эту функцию вызывали много раз, и мне не нужно было создавать объект NSDate, производительность была невелика.

Итак, чтобы получить формат, который мне давала оригинальная функция, попробуйте это:

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;

Что должно дать вам тот же результат, что и [[NSDate date] timeIntervalSince1970]

...